#include <stdio.h>
int stop(int (*knight)[8]);
int check(int i,int j,int (*knight)[8]);
void tour(int i,int j,int step,int (*knight)[8]);
int stop(int (*knight)[8])//判断停止条件,当棋盘都被填满则停止
{
int i,j;
for(i = 0;i < 8;i++)
{
for(j = 0;j < 8;j++)
{
if(knight[i][j] == 0)
{
return 1;
}
}
}
return 0;
}
void tour(int i,int j,int step,int (*knight)[8])//决定下一步
{
int t;
t = check(i,j,knight);//先进行检查
if(t = 0)//不可进行下一步则直接结束
{
return;
}
switch(t)
{
case 1:i -= 2,j -= 1;
case 2:i -= 2,j += 1;
case 3:i -= 1,j += 2;
case 4:i += 1,j += 2;
case 5:i += 2,j += 1;
case 6:i += 2,j -= 1;
case 7:i += 1,j -= 2;
case 8:i -= 1,j -= 2;
}
knight[i][j] = ++step;
tour(i,j,step,knight);
}
int check(int i,int j,int (*knight)[8])//检查knight[i][j]是否可以进行下一步
{
int m,n,k;
for(k = 1;k < 9;k++)
{
m = i,n = j;
switch(k)
{
case 1:m -= 2,n -= 1;
case 2:m -= 2,n += 1;
case 3:m -= 1,n += 2;
case 4:m += 1,n += 2;
case 5:m += 2,n += 1;
case 6:m += 2,n -= 1;
case 7:m += 1,n -= 2;
case 8:m -= 1,n -= 2;
}
if(knight[m][n] == 0)//如果可以,则函数返回k值
{
return k;
}
}
return 0;//不能进行下一步则返回0
}
int main()
{
int i,j,row,col,step = 1;
int knight[8][8];
for(i = 0;i < 8; i++)
{
for(j = 0;j < 8; j++)
{
knight[i][j] = 0;
}
}
printf("请输入起始的位置(例如第1行第1列):");
scanf("第%d行第%d列",&row,&col);
knight[row-1][col-1] = step;
while(stop(knight))//用stop函数控制循环结束
{
tour(row-1,col-1,step,knight);
}
for(i = 0;i < 8;i++)
{
for(j = 0;j < 8;j++)
{
printf("%d ",knight[i][j]);
}
}
return 0;
}