在船上任意随意位置骑士骑行旅游

时间:2018-04-17 20:23:55

标签: c optimization backtracking knights-tour

我对算法很新。我刚刚了解了回溯算法,并在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");
 }

}

0 个答案:

没有答案