图的遍历算法-马遍历棋盘
2016-06-13 11:18
309 查看
题目
在n*m的棋盘中,马只能走日子,马从位置(x,y)处出发,把棋盘的每一点都走一次,且只走一次,找出所有的路径。demo实现
棋盘设置为5*4,初始位置设置为(0.0)算法重点
回溯
在递归后方将坐标置为初始状态0。当路径错误的时候,能够把路径恢复到走之前的状态。
具体的实现,在注释中已经写得比较清楚。
#include<iostream> using namespace std; //坐标固定的马有八种走的方式 //用数组进行存储,方便在for中使用 int fx[8]= {1,2,2,1,-1,-2,-2,-1}; int fy[8]= {2,1,-1,-2,-2,-1,1,2}; static int mCount; const static int n=5,m=4; int a [m]; //用int二维数组来表示走的路劲 void mFind(int x,int y,int dep);//寻找路径的递归 int mCheck(int x,int y);//判断坐标是否出界,是否已经走过 void output();//打印路径 int main() { int x=0,y=0;//选择(0,0)为初始点 mCount=0; for(int i=0; i<n; i++) for(int j=0; j<m; j++) a[i][j]=0; a[x][y]=1; mFind(x,y,2); if(mCount==0) cout<<"Non solution"<<endl; else cout<<endl<<"final count = "<<mCount<<endl; } void mFind(int x,int y,int dep) { int xx,yy; for(int i=0; i<8; i++) { xx=x+fx[i]; yy=y+fy[i]; if(mCheck(xx,yy)==1) { a[xx][yy]=dep; if(dep==n*m) output(); //如果深度为n*m,那么表示遍历结束,就打印 else mFind(xx,yy,dep+1); a[xx][yy]=0; //回溯,恢复未走坐标。(如果走错,要将走错的路径还原) } } } int mCheck(int x,int y) { //判断坐标是否出界,是否已经走过 if(x<0||y<0||x>=n||y>=m||a[x][y]!=0) return 0; return 1; } void output() { mCount++; cout<<endl; cout<<"count= "<<mCount; for(int i=0; i<n; i++) { cout<<endl; for(int j=0; j<m; j++) cout<<a[i][j]<<" "; } }
相关文章推荐
- html css 控制div或者table等固定在指定位置
- Spring官方文档学习(3.2)
- LeetCode-349&350.Intersection of Two Arrays
- 关于爱情观的分享
- UDP包长建议
- Linux 如何查看进程的各线程的CPU占用
- hdu 2533 N皇后问题
- Android Studio some small tips
- 用secureCRT上传下载文件
- forEach遍历querySelectorAll的结果
- Jenkins+maven+tomcat8自动构建部署配置
- java文件操作小记
- mysql合并查询结果
- 由于缺少调试目标,无法开始调试。请生成项目并重试,或者相应的设置OutputPath和AssemblyName属性,使其指向目标程序集的正确位置。
- make-可以不看
- quartz2.2.1的基本操作
- 时间轴滚动充盈
- 时间轴滚动充盈
- oracle 数据泵使用
- AppCan认为,移动APP开发不是技术活