骑士周游问题解决方案

#include<stdio.h>

#define used  0

#define unused 1

typedef int Boolean;

typedef struct Knight

{

int n;

Boolean tab;

}Knight;

//判断周边是否有能走的位置

Boolean isok(Knight (*knight)[8],int row,int col);

//运用递归使马走动

void move(Knight (*knight)[8],int row,int col);

void move(Knight (*knight)[8],int row,int col)

{

int mark,i,j;

int step=0;

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

if(knight[i][j].tab==0)

step++;

}

}

if(step>=64)

{

return;

}

else

{

mark=isok(knight,row,col);

if(mark)

{

mark=isok(knight,row,col);

if(mark==1)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row+1][col+2].n);

knight[row+1][col+2].tab=used;

move(knight,row+1,col+2);

}

mark=isok(knight,row,col);

if(mark==2)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row+2][col+1].n);

knight[row+2][col+1].tab=used;

move(knight,row+2,col+1);

}

mark=isok(knight,row,col);

if(mark==3)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row+2][col-1].n);

knight[row+2][col-1].tab=used;

move(knight,row+2,col-1);

}

mark=isok(knight,row,col);

if(mark==4)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row+1][col-2].n);

knight[row+1][col-2].tab=used;

move(knight,row+1,col-2);

}

mark=isok(knight,row,col);

if(mark==5)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row-1][col-2].n);

knight[row-1][col-2].tab=used;

move(knight,row-1,col-2);

}

mark=isok(knight,row,col);

if(mark==6)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row-2][col-1].n);

knight[row-2][col-1].tab=used;

move(knight,row-2,col-1);

}

mark=isok(knight,row,col);

if(mark==7)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row-2][col+1].n);

knight[row-2][col+1].tab=used;

move(knight,row-2,col+1);

}

mark=isok(knight,row,col);

if(mark==8)

{

printf(“%d->%d\n”,knight[row][col].n,knight[row-1][col+2].n);

knight[row-1][col+2].tab=used;

move(knight,row-1,col+2);

}

}

}

}

Boolean isok(Knight (*knight)[8],int row,int col)

{

int ok;

if(knight[row+1][col+2].tab &&row+1<8&&col+2<8)

{

ok=1;

}

else if(knight[row+2][col+1].tab&&row+2<8&&col+1<8)

{

ok=2;

}

else if(knight[row+2][col-1].tab&&row+2<8&&col-1>=0)

{

ok=3;

}

else if(knight[row+1][col-2].tab&&row+1<8&&col-2>=0)

{

ok=4;

}

else if(knight[row-1][col-2].tab&&row-1>=0&&col-2>=0)

{

ok=5;

}

else if(knight[row-2][col-1].tab&&row-2>=0&&col-1>=0)

{

ok=6;

}

else if(knight[row-2][col+1].tab&&row-2>=0&&col+1<8)

{

ok=7;

}

else if(knight[row-1][col+2].tab&&row-1>=0&&col+2<8)

{

ok=8;

}

else 

{

ok=0;

}

return ok;

}

int main()

{

Knight knight[8][8];

int i,j,k=0;

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

knight[i][j].n=++k;

knight[i][j].tab=unused;

}

}

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

printf(“%4d”,knight[i][j].n);

}

printf(“\n\n”);

}

knight[0][0].tab=used;

move(knight,0,0);

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

printf(“%4d”,knight[i][j].tab);

}

printf(“\n\n”);

}

}

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/qq_37171273/article/details/55195209
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞