马踏棋盘--深度优先搜索

来源:互联网 发布:java导出带图excel 编辑:程序博客网 时间:2024/05/02 00:29

题目描述:

8 * 8 的棋盘,“马“ 初始位置于 <0,0>,按 “日” 行走,一次性不重复踏遍整个棋盘,共有多少种方案?并打印行走方案。


补充:

这里测试8阶棋盘,貌似方案数会非常多,小生程序效率貌似不怎么样,十几分钟没跑完,所以拿5阶来测试。只需要改变代码中的
#define X 5
即可测试任何阶马踏棋盘游戏,阶数越高,程序运行时间将会越长。(8阶都不知道要跑到什么时候。。)

代码中
void CHorse::funcStart(){funcTravel(0, 0, nStep);}

通过修改funcTravel函数中的0,0即可选择"马"的初始位置。


源码:

#include <stdio.h>#include <iostream>#define X 5using namespace std;static int nChess[X][X] = {0};class CHorse{public:CHorse();       // 构造函数void funcStart();       // 开始行走void funcCout();   // 打印棋盘void funcTravel(int x, int y, int n);   // 从点<x,y>继续行走bool funcNextStep(int *x, int *y, int z);  // 寻找下一步可行点int  funcGetnCount();   // 获取nCountprivate:static int nCount;        // 统计总共的可行方案数};int CHorse::nCount = 0;CHorse::CHorse(){}int CHorse::funcGetnCount(){return nCount;}void CHorse::funcStart(){funcTravel(0, 0, 1);}void CHorse::funcTravel(int x, int y, int n){int nTraveli, nX1=x, nY1=y;nChess[x][y] = n;if( n==X*X ){// 棋盘遍历完毕funcCout();}else{// 循环遍历周边8个可行方案for(nTraveli=0; nTraveli<8; nTraveli++){if( funcNextStep(&nX1, &nY1, nTraveli) ){funcTravel(nX1, nY1, n+1);nChess[nX1][nY1] = 0;nX1 = x;nY1 = y;}}}}bool CHorse::funcNextStep(int *x, int *y, int z){switch(z){case 0:if( *x>1 && *y>0 && nChess[*x-2][*y-1]==0 ){*x = *x-2;*y = *y-1;return true;}break;case 1:if( *x<X-2 && *y>0 && nChess[*x+2][*y-1]==0 ){*x = *x+2;*y = *y-1;return true;}break;case 2:if( *x>1 && *y<X-1 && nChess[*x-2][*y+1]==0 ){*x = *x-2;*y = *y+1;return true;}break;case 3:if( *x<X-2 && *y<X-1 && nChess[*x+2][*y+1]==0 ){*x = *x+2;*y = *y+1;return true;}break;case 4:if( *x>0 && *y>1 && nChess[*x-1][*y-2]==0 ){*x = *x-1;*y = *y-2;return true;}break;case 5:if( *x<X-1 && *y>1 && nChess[*x+1][*y-2]==0 ){*x = *x+1;*y = *y-2;return true;}break;case 6:if( *x>0 && *y<X-2 && nChess[*x-1][*y+2]==0 ){*x = *x-1;*y = *y+2;return true;}break;case 7:if( *x<X-1 && *y<X-2 && nChess[*x+1][*y+2]==0 ){*x = *x+1;*y = *y+2;return true;}break;}return false;}void CHorse::funcCout(){int i, j;nCount++;for(i=0; i<X; i++){for(j=0; j<X; j++){printf("%-4d", nChess[i][j]);}printf("\n");}printf("\n\n");}void main(){int n;CHorse objHorse;objHorse.funcStart();printf("::马踏棋盘游戏::以<0,0>为起点的5阶棋盘共有%d种走法\n\n", objHorse.funcGetnCount());}


效果图:

5阶:




8阶(未跑完):


0 0