马踏棋盘问题

来源:互联网 发布:大数据专业委员会 编辑:程序博客网 时间:2024/04/30 19:14

1.问题描述
设计一个国际象棋的马踏棋盘的演示程序
2.需求分析
(1)将马随即放在国际象棋的8×8棋盘BChess[8][8]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。
(2)求出马的行走路线,并按求出的行走路线,将数字1,2,……,64依次填入一个8×8的方阵,输出之。

#include <iostream>#include <time.h>#include <iomanip>using namespace std;#define X 8#define Y 8int chess[X][Y];//找到基于(x,y)下一个可走的位置int nextxy(int *x,int *y, int count){switch(count){case 0:if (*x+2<=X-1&&*y-1>=0&&chess[*x+2][*y-1]==0){*x+=2;*y-=1;return 1;}break;case 1:if (*x+2<=X-1&&*y+1<=Y-1&&chess[*x+2][*y+1]==0){*x+=2;*y+=1;return 1;}break;case 2:if (*x+1<=X-1&&*y-2>=0&&chess[*x+1][*y-2]==0){*x+=1;*y-=2;return 1;}break;case 3:if (*x+1<=X-1&&*y+2<=Y-1&&chess[*x+1][*y+2]==0){*x+=1;*y+=2;return 1;}break;case 4:if (*x-2>=0&&*y-1>=0&&chess[*x-2][*y-1]==0){*x-=2;*y-=1;return 1;}break;case 5:if (*x-2>=0&&*y+1<=Y-1&&chess[*x-2][*y+1]==0){*x-=2;*y+=1;return 1;}break;case 6:if (*x-1>=0&&*y-2>=0&&chess[*x-1][*y-2]==0){*x-=1;*y-=2;return 1;}break;case 7:if (*x-1>=0&&*y+2<=Y-1&&chess[*x-1][*y+2]==0){*x-=1;*y+=2;return 1;}break;default:break;}return 0;}void print(){int i,j;for (i=0;i<X;i++){for (j=0;j<Y;j++){cout<<setw(4)<<chess[i][j];}cout<<endl;}cout<<endl;}//深度优先遍历//(x,y)为位置坐标//tag为标记变量,每走一步tag加1int TravelVhessBoard(int x,int y,int tag){int x1=x,y1=y,flag=0,count=0;chess[x][y]=tag;if (tag==X*Y){return 1;}//找到马的下一个可走的坐标(x1,y1),如果找到flag=1,否则为0flag=nextxy(&x1,&y1,count);while (0==flag&&count<7){count++;flag=nextxy(&x1,&y1,count);}while (flag){if (TravelVhessBoard(x1,y1,tag+1)){return 1;}x1=x;y1=y;count++;flag=nextxy(&x1,&y1,count);while (0==flag&&count<7){count++;flag=nextxy(&x1,&y1,count);}}if (0==flag){chess[x][y]=0;} return 0;}int main(){int i,j;clock_t start,finish;start=clock();for (i=0;i<X;i++) {for (j=0;j<Y;j++){chess[i][j]=0;}}if (!TravelVhessBoard(2,0,1)){cout<<"Failure!"<<endl;} print();finish=clock();cout<<"Time= "<<double(finish-start)/CLOCKS_PER_SEC<<endl;return 0;}


 

0 0