题意如下:
马的遍历问题。设计程序完成如下要求:
在中国象棋棋盘上,对任一位置上放置的一个“马”.
均能选择一个合适的路线,使得该棋子能按象棋的规则
不重复地走过棋盘上的每一位置。
思路:这是一个DFS搜索,然后没有使用另外的数组来标记某一位置是否已经被走过,而是直接使用存步数的数组num[][]来作为标记数组!
然后我使用了两个数组作为方向坐标,以便能让马移动,同时也能记录马所在位置的坐标!(马是可以从8个移动方向中选择的!)
代码还是很好理解的!
至于棋盘的规格可以自己设定,我这里是使用的8x8的棋盘!
代码如下:
/* 马的遍历问题。设计程序完成如下要求: 在中国象棋棋盘上,对任一位置上放置的一个“马”. 均能选择一个合适的路线,使得该棋子能按象棋的规则 不重复地走过棋盘上的每一位置。程序输出8×8方阵. */ #include<cstdio> #include<iostream> #include<cstring> using namespace std; int num[8][8],ans,step,n,m; int xx[8]= {2,1,-1,-2,-2,-1,1,2}; int yy[8]= {1,2,2,1,-1,-2,-2,-1}; bool is_ok(int x,int y) { if(x<0||x>7||y>7||y<0) return false; if(num[x][y])//不等于0表明这个位置已经被走过了! return false; return true; } void print() { ans++; printf("第【%d】个走法:\n",ans); for(int i=0; i<8; i++) { for(int j=0; j<8; j++) printf("%4d",num[i][j]); printf("\n"); } printf("\n"); return ; } void dfs(int x,int y,int step) { for(int i=0; i<8; i++) { int X=xx[i]+x; int Y=yy[i]+y; if(is_ok(X,Y)) { num[X][Y]=step; if(64==step) print(); else dfs(X,Y,step+1); num[X][Y]=0; } } } int main() { int x,y; printf("请输入出发坐标:"); scanf("%d%d",&x,&y); memset(num,0,sizeof(num)); num[x][y]=1; ans=0; dfs(x,y,2); if(!ans) cout<<"没有合适的走法满足要求!\n"; cout<<"到此结束了...\n"; return 0; }
原文地址:http://blog.csdn.net/u014004096/article/details/40585983