【发布时间】:2014-02-02 14:24:42
【问题描述】:
所以我想出了这个实现来解决 8*8 棋盘的骑士巡回赛。 但似乎它需要很长时间才能运行(以至于我不得不停止它)。但是,如果我将 dx、dy 数组替换为用 cmets 编写的数组,程序就会像魔术一样工作并给出输出。他们说它巧妙地选择了数组,因此暴力算法很幸运能够快速找到解决方案。
但是如何首先提出这个数组,这个数组 (dx,dy) 我是从其他代码中得到的。那么谁能解释一下为什么这段代码适用于这些数组(在评论中)而不是我的。
#include <cstdio>
using namespace std;
int dx[8] = { 1, 1, 2, 2, -1, -1, -2, -2};
int dy[8] = { 2, -2, 1, -1, 2, -2, 1, -1};
//int dx[8] = { 2, 1, -1, -2, -2, -1, 1, 2 };
//int dy[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
bool solve(bool arr[8][8],int x,int y,int moves){
if(moves==0)return true;
if(x<0 || y<0 || x>7 || y>7 || arr[x][y])return false;
arr[x][y]=1;
for(int i=0;i<8;i++)
if(solve(arr,x+dx[i],y+dy[i],moves-1)){
printf(" (%d,%d) ",x,y);
return 1;
}
arr[x][y]=0;
return false;
}
int main()
{
bool arr[8][8];
for(int i=0;i<8;i++) for(int j=0;j<8;j++) arr[i][j]=0;
solve(arr,0,0,64);
puts("");
}
【问题讨论】:
-
我的建议是使用调试器单步执行代码,跟踪变量值。
-
"如果从 0,0 开始的游览如此之快,那么它可能是纯粹的机会,或者数组 xMove 和 yMove 被巧妙地初始化,因此 (0,0) 的解决方案很快就找到了。”,从stackoverflow.com/questions/18073258/…谷歌搜索时发现了这个
-
所以写这篇文章的人实际上并不知道这些值被巧妙地选择了。
-
可见heuristic的重要性。
标签: c++ algorithm backtracking knights-tour hamiltonian-cycle