北京精装画册印刷工厂:C棋盘跳马

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 11:33:35
5×5的棋盘格,一匹马位于左上角,如何使其无重复的跳完每一点。帮我看看这个,该错啊,有追加至少50
正确跳法:
1 16 21 10 25
20 11 24 15 22
17 2 19 6 9
12 7 4 23 14
3 18 13 8 5
#include<stdio.h>
#define N 6
#define ALL (N-1)*(N-1)//设定棋盘格式为(N-1)×(N-1)
int a[N][N]={1},fi[ALL],fj[ALL];
int tystep(int i,int j,int step)
{
int flag=0,pri=i,prj=j,c;
if(step==ALL)return 1;
else
for(c=1;!flag;){
do{
i=pri;
j=prj;
switch(c){
case 1:i+=2,j+=1;break;
case 2:i+=2,j-=1;break;
case 3:i+=1,j+=2;break;
case 4:i+=1,j-=2;break;
case 5:i-=2,j+=1;break;
case 6:i-=2,j-=1;break;
case 7:i-=1,j+=2;break;
case 8:i-=1,j-=2;break;//八种走法
default:break;
}
if(++c==10)break;
}while(a[i][j]||(i>=j?i:j)>=N||(i<=j?i:j)<1);//凡是超过棋盘坐标或踩到已经踩过的格子时换一种走法
if(c==10)
return 0;
else{
fi[step]=i;fj[step]=j;a[i][j]=1;
if(flag=tystep(i,j,step+1))return 1;//记录没一步
}
}
}

void print()
{
int step;
fi[0]=fj[0]=1;
for(step=0;step<ALL-1;step++)
printf("step%d:\t%d,%d-->%d,%d\n",step+1,fi[step],fj[step],fi[step+1],fj[step+1]);//输出
}

void main ()
{
a[1][1]=1;
if(tystep(1,1,1))
print();
else printf("error\n");
}
1 20 17 12 3
16 11 2 7 18
21 24 19 4 13
10 15 6 23 8
25 22 9 14 5
当然也是,我那个程序的目标就是最上面那种跳法