您的位置:首页 > 其它

中国象棋,马不重复的走完每一格

2016-01-22 10:56 337 查看
马从左上角开始走,数字代表第几步,90步刚好走完全场



源码如下(运行时间比较长)

//功能:在棋盘上用马不重复的走完每一格(可能会花好一段时间)
//时间 2015-4-23

#include <stdio.h>
#include <time.h>

#define X 10
#define Y 9

int chess[X][Y]={0};

int nextxy(int *x, int *y, int count)
{
switch(count)
{
case 0: if( *x+2<X && *y-1>=0 && chess[*x+2][*y-1]==0)
{
*x+=2; *y-=1; return 1;
} break;
case 1: if( *x+2<X && *y+1<Y && chess[*x+2][*y+1]==0)
{
*x+=2; *y+=1; return 1;
} break;                //往下边移动

case 2: if( *x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0)
{
*x-=2; *y-=1; return 1;
} break;
case 3: if( *x-2>=0 && *y+1<Y && chess[*x-2][*y+1]==0)
{
*x-=2; *y+=1; return 1;
} break;                 //往上边移动

case 4: if( *x+1<X && *y-2>=0 && chess[*x+1][*y-2]==0)
{
*x+=1; *y-=2; return 1;
} break;
case 5: if( *x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0)
{
*x-=1; *y-=2; return 1;
} break;                //往左边移动

case 6: if( *x+1<X && *y+2<Y && chess[*x+1][*y+2]==0)
{
*x+=1; *y+=2; return 1;
} break;
case 7: if( *x-1>=0 && *y+2<Y && chess[*x-1][*y+2]==0)
{
*x-=1; *y+=2; return 1;
} break;                //往右边移动

default: break;
}
return 0;
}

void printline()
{
int i,j;
printf("\n不重复走完每一格路径如下:\n");
for(i=0;i<X;i++)
{
for(j=0;j<Y;j++)
printf("%2d\t",chess[i][j]);
printf("\n");
}
printf("\n");
}

//深度优先遍历,(x,y)为起点坐标,tag为序号
int travelCHESSboard(int x, int y, int tag)
{
int x1=x, y1=y, flag=0, count=0;
chess[x][y]=tag;
if( X*Y==tag )
{
printline(); //如果tag=X*Y,表示已经走完每一格
return 1;
}
flag=nextxy(&x1, &y1, count);
while(0==flag && count<8)
{
count++;
flag=nextxy(&x1, &y1, count);
}                    //如果能找到空余的下一跳,flag=1

while(flag)
{
if(travelCHESSboard(x1,y1,tag+1))
{
return 1;
}
x1=x; y1=y; count++; flag=nextxy(&x1, &y1, count);

while(0==flag && count<8)
{
count++;
flag=nextxy(&x1, &y1, count);
}

}

if(0==flag) chess[x][y]=0;
return 0;
}

int main()
{
int a=1,b=1;
clock_t start,finish;
start=clock();

//chess[X][Y]={0};
printf("请输入起始位置的横纵坐标,坐标值从1开始。以空格隔开,回车结束:\n");
//scanf("%d %d",&a,&b);
if(!travelCHESSboard(a-1,b-1,1))
{
printf("着实找不到路径,you can you up! \n");
}

finish=clock();
printf("\n共耗时%f秒\n",(double)(finish-start)/CLOCKS_PER_SEC);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: