您的位置:首页 > 其它

骑士周游问题解决方案

2017-02-15 14:20 351 查看
#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");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: