骑士周游问题(马踏棋盘问题)DFS
2016-04-15 16:35
344 查看
马踏棋盘算法(骑士周游问题)
定义:将马随机放在国际象棋的8×8棋盘Board[0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。
如图:
用一个二维数组来存放棋盘,假设马儿的坐标为(x,y),那么可供选择的下一个位置共有8种可能。我们所要做的,就是从0号位置开始,依次判断新的马儿位置是否可用,不可用的话(即马儿已经走过该位置),则遍历下一个可能的1号位置,直到7号位置停止,如果没有可用位置,则进行回溯,如果回溯到了起始位置,则表示此路不通,即无法从该位置开始遍历整个棋盘。如果在遍历0-7号位置的过程中,发现有可用位置,则将该位置坐标赋予(x,y)。之后,利用递归,再次寻找马儿的新的跳跃位置。直到马儿跳了64次时停止,此时,马儿就已经将整个棋盘走过了。
code:
定义:将马随机放在国际象棋的8×8棋盘Board[0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。
如图:
用一个二维数组来存放棋盘,假设马儿的坐标为(x,y),那么可供选择的下一个位置共有8种可能。我们所要做的,就是从0号位置开始,依次判断新的马儿位置是否可用,不可用的话(即马儿已经走过该位置),则遍历下一个可能的1号位置,直到7号位置停止,如果没有可用位置,则进行回溯,如果回溯到了起始位置,则表示此路不通,即无法从该位置开始遍历整个棋盘。如果在遍历0-7号位置的过程中,发现有可用位置,则将该位置坐标赋予(x,y)。之后,利用递归,再次寻找马儿的新的跳跃位置。直到马儿跳了64次时停止,此时,马儿就已经将整个棋盘走过了。
code:
#include<iostream> #include<cstring> #include<cstdio> #define M 100 #define MS(x,y) memset(x,y,sizeof(x)) using namespace std; int n,ans; //骑士走棋盘 n*n; int dis[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; //方向数组 int num[M][M]; //标记骑士走过的路线 bool vis[M][M]; void shownum() { int i,j; for(i=0;i<n;++i) { for( j=0;j<n;++j) { printf("%4d",num[i][j]); } printf("\n"); } printf("\n"); } void dfs(int x,int y,int t) { //printf("x=%d,y=%d,t=%d\n",x,y,t); if(t>n*n) { ans++; shownum(); return ; } int i,j,x1,y1; for(i=0;i<8;++i) { x1=x+dis[i][0]; y1=y+dis[i][1]; if(x1>=0&&x1<n&&y1>=0&&y1<n&&!vis[x1][y1]) { vis[x1][y1]=true; num[x1][y1]=t; dfs(x1,y1,t+1); vis[x1][y1]=false; /*num[x1][y1]=0; //可置可不置*/ } } } int main() { while(scanf("%d",&n)!=EOF) { int x,y; //初始位置 scanf("%d%d",&x,&y); ans=0; MS(vis,false); MS(num,0); vis[x][y]=true; num[x][y]=1; dfs(x,y,2); //shownum(); printf("%d\n",ans); } return 0; }
相关文章推荐
- c#实验5.3:物体类的扩展
- 程序员数学--卡特兰数(Catalan number)
- jq插件写法
- Windows平台下GCC编程之根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。 s=1+1/3+1/5+···+1/(2n-1)
- Android下OkHttp请求自定义HTTPS证书接口设置
- nginx正则说明
- FTP-模式
- HTML及CSS基础
- java第四次作业(补)
- 路由器被蹭网后,我有被黑的风险吗?
- 接口与抽象类的理解2
- Android开发在Eclipse提示信息This element neither has attached source nor attached Javadoc
- Java将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
- Java 实现导出excel表 POI
- html学习之路——第二天(1)
- 无聊用一个DIV写了一套字母数字表
- 【OpenCV】cvFindContours参数详解
- WPF DataGrid实现分页显示
- git .gitignore 生效
- MVC和MVP的区别