标签:
国际象棋中的马,从任何一个格子开始,是否可以找到一种走法,走遍全部的64个格子,并且要求已经走过的点不要重复地走,但不要求最后回到出发点
采用深度优先,递归调用。
#include <iostream> #include <iomanip> //I/O流控制头文件,setw()的头文件,setw(n) 设域宽为n个字符 #define N 12 //定义一个宏并赋初值 using namespace std; int b[N][N]; //定义全局性的二维数组保存步数 bool a[N][N]; //记录某一点是否已经走过 int num=0; //记录方案数 int dx[]={0,1,1,-1,-1,2,2,-2,-2}; int dy[]={0,2,-2,2,-2,1,-1,1,-1}; //提供每一步的走法 void solve(int i,int j,int k,bool&ok,int n) //计算走法 { int m,x1,y1,n1,n2; bool t1,t2; //布尔变量 for(m=1;m<=8;m++) { x1=i+dx[m]; y1=j+dy[m]; t1=((x1>=0)&&(x1<n)); //判断x是否在棋盘内 t2=((y1>=0)&&(y1<n)); //判断y是否在棋盘内 if((t1==true)&&(t2==true)&&(a[x1][y1]==true)) { a[x1][y1]=false; //记录该点已经走过 b[x1][y1]=k; //k代表第几步 if(k<n*n) { solve(x1,y1,k+1,ok,n); } else { num++; //方案数加一 ok=true; cout<<"方案"<<num<<" :"<<endl; for(n1=0;n1<n;n1++) { for(n2=0;n2<n;n2++) { cout<<setw(4)<<b[n1][n2]; //依次输出经过每一点时的步数 } cout<<endl; } //return; } a[x1][y1]=true; } } } int main() { int i,j,row,col,n; bool ok=false ; cout<<"请输入n:"; cin>>n; for(i=0;i<n;i++) { for(j=0;j<n;j++) a[i][j]=true; } cout<<"请输入起始位置的坐标:"; cin>>row>>col; b[row-1][col-1]=1; //设置起始点 a[row-1][col-1]=false; solve (row-1,col-1,2,ok,n); //调用函数计算结果 if(!ok) cout<<"从点("<<row<<","<<col<<")出发无法遍访棋盘的每一个位置"<<endl; system("pause"); return 0; }
标签:
原文地址:http://www.cnblogs.com/LJJ1010/p/4495515.html