我写的马遍历棋盘的程序,让大家见笑了。麻烦大家调一下,看输出结果对吗,为何只有一组解?
//问题:马跳棋盘,让马遍历国际象棋棋盘
//本程序使用递归法进行求解,在VC++6.0环境下调试通过
//作者:rainer
//时间:2004年4月26日
//问题:输出只有一组解
#include<stdio.h>
int a[8][8],count=0;//a[8][8]是记录马所跳位置的数组,0表示此位可跳,其他数字记录马走过此位的次序
int ok(int i,int j)//判断a[i][j]位置是否能放子
{
if(a[i][j]==0)return 1;
else return 0;
}
void ma(int i,int j)
{
int step,b,k1,k2;
if(count==64)//输出出口
{
for(b=1;b<=64;b++)
for(k1=0;k1<8;k1++)
for(k2=0;k2<8;k2++)
if(b==a[k1][k2])
{
if(k2%3==0)printf("\n");
printf("step:[%d] -> [%d,%d] ",b,k1,k2);
}
}
for(step=0;step<8;step++)//step表示马向八个方向跳
{
switch(step)
{
case 0:
{
if(i>=0&&j>=0&&i<8&&j<8&&i-1>=0&&j-2>=0&&i-1<8&&j-2<8&&ok(i-1,j-2)==1)//马的当前位置和即将要跳的位置都在棋盘内,且即将要跳的位置是马没有跳过的位置,下面雷同
{
i=i-1;
j=j-2;
a[i][j]=++count;//记录当前跳是第几次跳
ma(i,j);//跳下一步
break;
}
}
case 1:
{
if(i>=0&&j>=0&&i<8&&j<8&&i-2>=0&&j-1>=0&&i-2<8&&j-1<8&&ok(i-2,j-1)==1)
{
i=i-2;
j=j-1;
a[i][j]=++count;
ma(i,j);
break;
}
}
case 2:
{
if(i>=0&&j>=0&&i<8&&j<8&&i-2>=0&&j+1>=0&&i-2<8&&j+1<8&&ok(i-2,j+1)==1)
{
i=i-2;
j=j+1;
a[i][j]=++count;
ma(i,j);
break;
}
}
case 3:
{
if(i>=0&&j>=0&&i<8&&j<8&&i-1>=0&&j+2>=0&&i-1<8&&j+2<8&&ok(i-1,j+2)==1)
{
i=i-1;
j=j+2;
a[i][j]=++count;
ma(i,j);
break;
}
}
case 4:
{
if(i>=0&&j>=0&&i<8&&j<8&&i+1>=0&&j+2>=0&&i+1<8&&j+2<8&&ok(i+1,j+2)==1)
{
i=i+1;
j=j+2;
a[i][j]=++count;
ma(i,j);
break;
}
}
case 5:
{
if(i>=0&&j>=0&&i<8&&j<8&&i+2>=0&&j+1>=0&&i+2<8&&j+1<8&&ok(i+2,j+1)==1)
{
i=i+2;
j=j+1;
a[i][j]=++count;
ma(i,j);
break;
}
}
case 6:
{
if(i>=0&&j>=0&&i<8&&j<8&&i+2>=0&&j-1>=0&&i+2<8&&j-1<8&&ok(i+2,j-1)==1)
{
i=i+2;
j=j-1;
a[i][j]=++count;
ma(i,j);
break;
}
}
case 7:
{
if(i>=0&&j>=0&&i<8&&j<8&&i+1>=0&&j-2>=0&&i+1<8&&j-2<8&&ok(i+1,j-2)==1)
{
i=i+1;
j=j-2;
a[i][j]=++count;
ma(i,j);
break;
}
}
}
}
}
void main()
{
int i=0,j=0;
for(i=0;i<8;i++)//初始化棋盘,使刚开始棋盘上任一位置都可以放子
for(j=0;j<8;j++)
a[i][j]=0;
i=0;
j=0;
a[i][j]=1;//把子放在[0][0]处
count=1;//计数器加一
ma(i,j);
}