数学家华罗庚的名言:跳马问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/06 12:34:33
题目如下:在5*5格的棋盘上,有一个国家象棋的马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘后再条回出发点。
现给出我的代码如下:VC下编译没有问题 但是运行没有显示,希望感兴趣的朋友帮我看看,另外感觉这个方法有点笨,不知其他的朋友有没有好的见解?
#include "stdio.h"
#define MAX 5

int a[MAX][MAX];
int b[MAX*MAX],c[MAX*MAX];
int scheme;

//显示符合规则的跳马方案
void print(void)
{
int i;

if((b[MAX*MAX-1]==0) && (c[MAX*MAX-1]==0)) //要求回到原点
{
for(i=0;i<MAX*MAX-1;i++)
printf("(%d,%d)\t",c[i],b[i]);
//统计方案总数
++scheme;

printf("\n");
}
}

//跳马函数,通过递归调用,寻找下一步的位置
int horse(int x,int y,int step)
{
int i,j;

//标识棋子在棋盘中的当前位置已跳过
a[x][y]=1;
//记录棋子在棋盘中的当前位置
b[step]=x;
c[step]=y;
//判断是否找到符合规则的完整的跳马方案(跳马步数为24步时)
if(step>=MAX*MAX-1)
{
print(); //打印完整的跳马路径
printf("\n");
}
//寻找下一步位置,共有八种可选位置,逐一迳行试探,
//如果符合要求(此位置不越界,在棋盘内,且此点未被跳过),
//则继续递归调用寻找此位置的下一位置,如此点不符合要求,
//则返回0,递归回退。
if((i=x)>=0 && (i=x)<MAX && (j=y+1)>=0 && (j=y+1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x+1)>=0 && (i=x+1)<MAX && (j=y+1)>=0 && (j=y+1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x+1)>=0 && (i=x+1)<MAX && (j=y)>=0 && (j=y)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x+1)>=0 && (i=x+1)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x)>=0 && (i=x)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x-1)>=0 && (i=x-1)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x-1)>=0 && (i=x-1)<MAX && (j=y)>=0 && (j=y)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

if((i=x-1)>=0 && (i=x-1)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;

//对没找到合适位置的处理
//至当前位置状态为0,恢复未跳过状态
a[x][y]=0;

//清除设置记录跳过位置的坐标
b[step]=c[step]=-1;

return 0;
}
int main(int argc, char* argv[])
{

int i,j;
//初始化棋盘位置
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
a[i][j] = 0;

//初始化记录坐标数组
for(i=0;i<MAX;i++)
b[i] = c[i] = -1;

//寻找符合要求的方案
horse(0,0,0);
printf("There are %d schemes\n",scheme);
return 1;
}

www.csdn.net请教一下吧,那的高手