我正在尝试用 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;
}
}