目录
介绍
魔方
解决魔方的一个天真的方法:排列
C#程序通过回溯解决魔方
通过生排列换来解决魔方
使用代码
注意事项
- 下载源代码3.5 KB
回溯是一种编程技术,用于解决没有已知解决方案的问题。已知解问题的一个例子是计算从1开始的前N个整数的和。它很容易实现为:
int sum = 0;
for ( int i = 1; i 0; --i )
{
numbers.Enqueue( i );
}
steps = 0L;
row = col = 0;
done = false;
startTime = DateTime.Now;
PlaceNumber( _params );
endTime = DateTime.Now;
if ( !done )
{
Console.WriteLine( "\n\n{0} steps", steps );
Console.WriteLine( "\nNo solution for N = {0} and Magic number = {1}\n",
_params.N, _params.MagicNumber );
}
ReportTimes( startTime, endTime );
}
}// SolveSquare
函数InitializeSquare将正方形中的所有元素都设置为零,以指示未放置任何数字,因此此处不会复制。关键函数是PlaceNumber负责尝试解决方案时放置数字,回收已放置的数字以及在回溯期间删除数字。如果PlaceNumber函数的参数中的ShowStep字段设置为true,则在该Console.Write语句的调用中,符号“.{0}”表示已在正方形中放置了一个数字,而符号“ 0 ) && ValidPosition( _params ) ) { n = numbers.Count; k = 0; do { m = numbers.Dequeue(); // Remove number at the head. if ( ( e = square[ row, col ] ) != 0 ) { numbers.Enqueue( e ); // Recycle the current number. } square[ row, col ] = m; // Put the dequeued number in its place. if ( _params.ShowStep ) { Console.Write( ".{0} ", m ); // number placed } ++k; ++steps; if ( SquareOK( _params ) ) { if ( numbers.Count == 0 ) { done = true; ShowSquare( _params ); } else { NextPosition( _params ); // Compute next (row, col) coordinates. PlaceNumber( _params ); // Recursively place another number. } } } while ( k < n && !done ); // k == n || done if ( !done ) // backtrack { numbers.Enqueue( square[ row, col ] ); // Recycle the number at the // current position. if ( _params.ShowStep ) { Console.Write( "
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录