【发布时间】:2014-03-15 16:50:27
【问题描述】:
我正在尝试用 8*8 棋盘解决骑士的巡回赛问题。但是我的回溯是无限循环的。我的逻辑函数如下:-
N 是 8。
boolean algo(int x,int y,int no_of_moves,int sol[][]){
if(no_of_moves==N*N){
return true;
}
int nextx;
int nexty;
for(int i=0;i<8;i++){
nextx=x+move_x[i];
nexty=y+move_y[i];
if(is_valid(nextx,nexty)){
sol[nextx][nexty]=no_of_moves;
if(algo(nextx,nexty,no_of_moves+1,sol)){
return true;
}
else
sol[nextx][nexty]=-1;
}
}
return false;
}
sol [][] 存储骑士的动作。
数组 move_x 和 move_y 存储要添加到 x 和 y 以获得骑士的下一个位置的值。
int move_x[]={ 2, 1, -1, -2, -2, -1, 1, 2 };
int move_y[]={ 1, 2, 2, 1, -1, -2, -2, -1 };
我首先将 x 作为 0,y 作为 0,no_of_moves 作为 1,并将 sol[][] 中的所有值作为 -1 除了 sol[0][0] 为 0。
然后is_valid() 检查nextx 和nexty 是否在棋盘内并且尚未访问。
boolean is_valid(int xnext,int ynext)
{
if(xnext>=0 && xnext<N && ynext>=0 && ynext<N && sol[xnext][ynext]==-1)
{
return true;
}
else
{
return false;
}
}
【问题讨论】:
-
我很确定它不是无限的。它更像 number_of_moves^(N*N)。你确定你检查你是否已经正确地访问了这个领域?最简单的方法是在非常小的板上运行它,比如 3x3,然后检查它是否真的结束了。
-
您可能希望在问题中包含您的
is_valid()方法,以防出现问题。 -
boolean is_valid(int xnext,int ynext){ if(xnext>=0&&xnext
=0&&ynext
标签: java backtracking knights-tour