我对算法很新。我刚刚了解了回溯算法,并在youtube上看到了一个关于骑士游览问题的视频。视频解决问题,骑士从初始位置开始为(0,0)。我试图为任何随机位置实现它。这适用于6 * 6网格,我在2分钟后获得了7 * 7网格的输出。对于8 * 8网格我等了大约15分钟,但我没有得到任何输出。在递归调用printf
函数之前,我尝试使用solve
调试它。但我无法弄清楚任何事情。我不知道任何优化技术。我刚刚在c。
如果n为8且knight从(0,0)位置开始,则代码可以正常工作。如果我使用solve(0,0,1)
,则solve(3,4,1)
的位置不会给出任何输出。
#include<stdio.h>
#include<stdlib.h>
#define n 8
int solve(int,int,int);
int nextx(int ,int);
int nexty(int,int);
void print(void);
int grid[n][n]={0};
int main()
{
print();
printf("\n\n");
solve(3,2,1);
print();
return 0;
}
int solve(int x,int y,int number)
{
if(number>(n*n)) return 1;
int move=0;
if(grid[x][y]==0)
{
while(move<8)
{
if((nextx(x,move)!=-1)&&(nexty(y,move)!=-1))
{
grid[x][y]=number;
if(solve(nextx(x,move),nexty(y,move),number+1))
return 1;
}
move++;
}
grid[x][y]=0;
}
return 0;
}
int nextx(int x,int move)
{
if(move==0) x=x+1;
else if(move==1) x=x+2;
else if(move==2) x=x+2;
else if(move==3) x=x+1;
else if(move==4) x=x-1;
else if(move==5) x=x-2;
else if(move==6) x=x-2;
else if(move==7) x=x-1;
if(x<0||x>(n-1))
return (-1);
else
return(x);
}
int nexty(int y,int move)
{
if(move==0) y=y-2;
else if(move==1) y=y-1;
else if(move==2) y=y+1;
else if(move==3) y=y+2;
else if(move==4) y=y+2;
else if(move==5) y=y+1;
else if(move==6) y=y-1;
else if(move==7) y=y-2;
if(y<0||y>(n-1))
return (-1);
else
return(y);
}
void print(void)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%3d ",grid[j][i]);
printf("\n");
}
}