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