算法:马的Hamilton周游路线问题
在国际象棋中马是走日字的,如果是一般情况马一共有八种走法(如下图):
所以我在这边用2个一位数组来表示其8种走法//考虑到马有8种走法int dx[8]={-2,-1,1,2,-2,-1,2,1};int dy[8]={-1,-2,-2,-1,1,2,1,2};之后就让马根据这八种走法来走不过还要考虑下面3种情况第一种情况如果马的下一步走法已经超出棋盘的范围了那么就不应该让马接下来走这一步转而去考虑其他的走法第二种情况如果马的下一步是已经走过的那么就不应该让马接下来走这一步转而去考虑其他的走法第三种情况如果马能够遍历完棋盘,那么就要考虑其最后一步是否可以通过上述的八种走法中的一种到达最开始的一步
C++实现:
#include<bits/stdc++.h>
using namespace std;
int N,M;
int a[100][100];
struct Node
{int x;int y;
};
Node Q[10005];
//定义马走的八个方向
int dir_x[8] = {-1,-2,-2,-1,1,2,2,1};
int dir_y[8] = {2,1,-1,-2,-2,-1,1,2};
//打印
void print()
{for(int i=0;i<N;i++){for(int j=0;j<M;j++)printf("(%d,%d) ",Q[i*N+j+1].x,Q[i*N+j+1].y);cout<<endl;}cout<<endl<<endl;for(int i=0;i<N;i++){for(int j=0;j<M;j++){printf("%-3d ",a[i][j]);}cout<<endl;}
}
//判断下一步是否是起始的位置
bool judge(int x,int y)
{for(int i=0;i<8;i++){if(x+dir_x[i]==0&&y+dir_y[i]==0)//0表示马的起始位置 return true;}return false;
}
void dfs(int cx,int cy,int step)
{if(step==N*M+1&&judge(cx,cy)){print();exit(1);}int tx,ty;for(int i=0;i<8;i++){tx = cx + dir_x[i];//下一步的坐标x ty = cy + dir_y[i];//下一步的坐标y if(tx<0||tx>=N||ty<0||ty>=M||a[tx][ty]!=0){continue;}Q[step].x=tx;Q[step].y=ty;a[tx][ty]=step;dfs(tx,ty,step+1);a[tx][ty]=0;//当遍历完棋盘后将棋盘重新置为0(表示马为走过),起始位置还是1 }
}
int main()
{cin>>N>>M;a[0][0]=1;Q[1].x=0;Q[2].y=0;dfs(0,0,2);return 0;
}
运行效果:
算法:马的Hamilton周游路线问题相关推荐
- 马的Hamilton周游路线问题
关于这道题,很多博客中都有相应的解法,我也看了很多篇,但是我发现,大多数都没有做到回到起点这个要求,所以我写一写自己的解法,如有错误欢迎指出. 问题描述: 8*8的国际象棋棋盘上的一只马(日字走法), ...
- 马的Hamilton周游路线
8*8的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点,这条路线称为马的一条Hamilton周游路线.对于给定的m*n的国际象棋棋盘,m和n均为大于5的偶数,且|m-n| ...
- 算法设计与分析----马的周游路线
8 * 8的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点,这条路线称为马的一条Hamilton周游路线.对于给定的m * n的国际象棋棋盘,m和n均为大于5的偶数,且| ...
- 马的哈密顿周游(分治)
马的哈密顿周游(分治) 需求分析 0.问题描述 8x8 的国际象棋棋盘上的一只马,恰好走过除起点外的其他63个位置各一次,最后回到起点.这条路线称为马的一条Hamiton周游路线.对于给定的mxn的国 ...
- 有限算法下的技术实现路线
有限算法下的技术实现路线 从信息技术本身来说,它最大的优势是可以快速处理复杂的运算.我们企业做信息化要善于利用这样的优势,而不是因为它有这样的优势就考虑怎么用它,那样非常容易作茧自缚的.在不考虑业务逻 ...
- 蓝桥杯 ALGO-25 算法训练 Car的旅行路线
问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 条笔直的高速铁路,第I个城市中高速铁路了的单 ...
- 数学建模常用算法—马尔可夫预测
今天数模君带大家学习一下数学建模中的预测算法之马尔科夫预测. 目录 模型的含义 实例分析 模型的含义 马尔可夫(Markov)预测法,就是一种关于事件发生的概率预测方法.它是根据事件的目前状况来预测其 ...
- floyd算法java_利用JAVA和Floyd算法实现上海地铁最短路线搜索系统
[实例简介] Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路. [实例截图] [核心代码] SUBWAY └── SUBWAY ├── bin │ ...
- 追梦算法----马的遍历
说明 中国象棋半张棋盘如图(a)所示.马自左下角往右上角跳.今规定只许往右跳,不许往左跳,且要求马跳的方式按照(b)图顺时针深度优先递归.比如图(a)中所示为一种跳行路线.如果马要从0,0点,跳到4, ...
最新文章
- final关键字用法
- 【计算机网络】深入浅出网络层(看不懂你来打我.上)
- C#,silverlight中 将颜色字符串的RRGGBB转换成为颜色
- sgi stl 之list
- 三杯茶(一本令全世界为之动容的书)(Three cups of tea)
- 怎样理解 MVVM ( Model-View-ViewModel ) ?
- 【软件质量】代码注释的消极作用
- 安卓+servlet+MySql 查询+插入(汉字乱码解决)
- html align 属性,align-content
- MySql类似Oracle的dual虚拟表
- mysql 快日志_Mysql慢查询日志记录更快的查询
- Springboot+Vue+EasyExcel实现web页面的excel下载
- 如何提高测试的工作效率?都有哪些具体手段?
- 最全搭建自己的SOCKS代理服务器
- 广义表的长度,深度及复制广义表的算法
- c语言基础代码(基础代码编程)
- Android聊天室(客户端)
- 环境配置 | ubuntun16.04下卸载matlab
- 数据结构与算法37-堆石子
- 家里光猫用管理员权限登录
热门文章
- 商汤实习面试准备(已上岸)
- 好的IT学习网站(不断更新)
- 程序员的浪漫——Node.js实现通过邮件定时给女朋友发情话
- float gpu 加速_根本没有GPU加速
- excel 日期函数date
- 现在普通家用计算机的运算速度,中国目前运算速度最快的计算机
- 腾讯qq中奖是真的吗_小程序真的救得了“中年危机”的QQ吗?
- Linux安装FTP及使用python上传下载ftp
- 爬虫python下载网站所有图片_python爬虫(4):多页图片批量下载-澎湃网信息图...
- uniApp sticky 吸顶 兼容小程序 h5