详细解析马踏棋盘
原文地址:http://c.biancheng.net/cpp/html/3376.html 一哥们写的,但是对于我这个新手来说确实花费了一点时间才能看懂,做了一些注释,望萌新能更快地理解 中国象棋的马只能走日字,从一个点出发能走的几个位置如下,前提是不能跳出棋盘 #include <stdio.h> #define X 8 #define Y 8 int chess[X][Y];//一个8*8的棋盘 int nextxy(int *x, int *y, int count) /*找到基于x,y位置的下一个可走的位置,count是0到7其中的一个位置*/ { switch(count) { case 0: if(*x+2<=X-1 && *y-1>=0 && chess[*x+2][*y-1]==0)//x+2向右移,y-1向下移,不能跳出边界,等于0是保证没有重复,因为跳过的地方都被赋了表示次序的不为0的数值 { *x=*x+2; *y=*y-1; return 1; } break; case 1: if(*x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1]==0) { *x=*x+2; *y=*y+1; return 1; } break; case 2: if(*x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2]==0) { *x=*x+1; *y=*y-2; return 1; } break; case 3: if(*x+1<=X-1 && *y+2<=Y-1 && chess[*x+1][*y+2]==0) { *x=*x+1; *y=*y+2; return 1; } break; case 4: if(*x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0) { *x=*x-2; *y=*y-1; return 1; } break; case 5: if(*x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1]==0) { *x=*x-2; *y=*y+1; return 1; } break; case 6: if(*x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0) { *x=*x-1; *y=*y-2; return 1; } break; case 7: if(*x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2]==0) { *x=*x-1; *y=*y+2; return 1; } break; default: break;//往哪走都不行了 } return 0; } 所以马有能走的位置就返回1,不能就返回0 int TravelChessBoard(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; } //如果马走的最后一个位置是64,那么皆大欢喜,结束了 flag=nextxy(&x1, &y1, count);//所以马有能走的位置就返回1,不能就返回0 //找寻这一步能走的位置 while(flag==0 && count<7) { count=count+1; flag=nextxy(&x1, &y1, count); } //flag=1,count<7 跳出循环 while(flag) { if(TravelChessBoard(x1, y1, tag+1)) return 1; x1=x; y1=y; count=count+1; flag=nextxy(&x1, &y1, count); /*寻找下一个(x,y)*/ while(flag==0 && count<7) { /*循环地寻找下一个(x,y)*/ count=count+1; flag=nextxy(&x1, &y1, count); } } //flag==0 说明上面的count>=7,也就是没找到能跳的位置 if(flag == 0) chess[x][y]=0; return 0; } int main() { int i, j; //初始化棋盘 for(i=0; i<X; i++) for(j=0; j<Y; j++) chess[i][j]=0; if(TravelChessBoard(2, 0, 1)) { for(i=0; i<X; i++) { for(j=0; j<Y; j++) printf("%-5d", chess[i][j]); printf("\n"); } printf("The horse has travelled the chess borad\n"); } else printf("The horse cannot travel the chess board\n"); return 0; }
运行结果如下