【题目来自灰灰考研】

2018上海交通大学上机题)(2017华中科技大学上机题

假设国际象棋棋盘有5*5共25个格子。设计一个程序,使棋子从初始位置(如图)开始跳马,需要将棋盘的格子全部都走一遍,每个格子只允许走一次。

问:总共有多少解。(提示:回溯法)

P.S国际象棋的棋子是在格子中间的。国际象棋中的“马走日”,如下图2所示,第一步为[1,1],第二步为[2,8]或[2,12],第三步可以是[3,5]或[3,21]等,以此类推。

#include<iostream>
#include<cstdlib>
#include<cstring>
#define MIN 0xc0c0c0c0
#define MAX 0x3f3f3f3f
using namespace std;const int n = 5, m = 5;//定义问题规模
int count = 0;//问题解法数量
int map[n][m], trace[5][5], visit[5][5];//map表示整个地图,trace记录路径,visit用来记录当前点是否被走过
int moveDirection[][2] = {1, 2, 1, -2, -1, 2, -1, -2, 2, 1, 2, -1, -2, 1, -2, -1};//下一步相对于当前位置的偏移量 void PrintTrace(int data[][m]);
void HorseJumpSolutionNumbers(int x, int y, int steps)
{trace[x][y] = steps;if(n * m == steps)//如果走的步数等于问题的规模,即找到一种解法 {if(count == 0)PrintTrace(trace);//这路仅仅打印第一个解法的路径 count++;//问题解法+ 1 }int nextX, nextY;for(int i = 0; i < 8; i++){nextX = x + moveDirection[i][0];nextY = y + moveDirection[i][1];//下一步的坐标 if(nextX < 0 || nextX >= n || nextY < 0 || nextY >= m)//判断坐标是否合法 continue;if(visit[nextX][nextY] == 0)//坐标合法且未被访问过,才进行访问 {visit[nextX][nextY] = 1;//访问标记为1 HorseJumpSolutionNumbers(nextX, nextY, steps + 1);//以当前点为父节点,递归访问下一步 visit[nextX][nextY] = 0;//以当前点为基准访问完所有子问题的解空间后,要进行回溯,所以要取消当前节点的标记 }}}
void PrintTrace(int data[][m])
{for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cout<<trace[i][j]<<"\t";}cout<<endl;} cout<<"==================="<<endl;
}int main()
{int x, y;memset(map, 0, sizeof(map));memset(trace, 0, sizeof(trace));memset(visit, 0, sizeof(visit));x = 0;y = 0;visit[x][y] = 1;HorseJumpSolutionNumbers(x, y, 1);cout<<"共有走法:"<<count<<endl; return 0;
} 

数据结构-马走日的解法相关推荐

  1. 马走日的解法(dfs)

    马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...

  2. 东华码蹄集第21周oj赛(光潮的幻像,分苹果,马走日,码哥猜想)

    小码哥在雪山闲逛的时候发现了一个神秘的序列.他发现如果按照一定的方式对这个序列进行操作,就可以得到一些隐藏的线索.这个序列含有n个整数,你需要对其进行m 次操作,操作分为两种: 1.给出下标α和整数y ...

  3. 算法提高课-搜索-DFS之搜索顺序-AcWing 1116. 马走日:dfs

    题目分析 来源:acwing 分析: dfs分两类,一类是内部搜索,不需要恢复现场:一类是外部搜索(以整个图作为状态),需要恢复现场.这里的马走日就是状态图,需要恢复现场. 理清dfs,需要画一个搜索 ...

  4. 信息学奥赛一本通(1219:马走日)

    1219:马走日 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 12078     通过数: 6316 [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程 ...

  5. 马走日程序Java_马走日什么意思

    中国象棋在中国有着三千多年的历史,在中国古代,象棋被列为士大夫们的修身之艺,属于琴棋书画四艺之一.现在则被视为是怡神益智的一种有益身心的活动. 中国象棋是由两人轮流走子,以"将死" ...

  6. Bailian4123 马走日【DFS】

    4123:马走日 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的 ...

  7. 【密码岛OJ】1753 马走日题解

    作为一名密码岛码农,出道深搜 马走日是一道典型的深搜题,主要找准方向再判断日字形就完了 上代码 第一次写题解 不是很熟练 马走日的主要思路就是先定义两个方向数组,然后开一个dfs 求累加和 如果属于日 ...

  8. 马走日,象走田;车走直路炮翻山

    棋子种类 车(車)马(馬)象(相)士(仕)将(帅): 还有炮(砲)和卒(兵). 走法口诀 马走日,象走田: 车走直路炮翻山: 士走斜线护将边: 小卒一去不回还. 走法解读 马为骑兵,直走斜砍,故走日! ...

  9. GDUT - 专题学习1 C - 马走日

    C - 马走日 题目 马在中国象棋以日字形规则移动. 请编写一段程序,给定 n×m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. ...

最新文章

  1. android 代码混淆 gson,Android RecyclerView和Gson混淆问题
  2. c# webapi POST 参数解决方法
  3. dpkg ---- apt-get ------ aptitude 三种方式的区别 及命令格式
  4. android studio 控件提示大写
  5. FREE 开源 API 管理工具等
  6. dc综合与pt静态时序分析(中文)_小三电系统(PDU+DC+OBC)的技术研究
  7. c#中WinForm中拖拽窗体实现移动功能(无边框模态窗体)
  8. heartbeat 日志分析
  9. python数据结构剑指offer-重建二叉树
  10. 对Go 1.16 io/fs设计的第一感觉:得劲儿!
  11. ElementUI:使input自动聚焦的两种方法
  12. ❤️制作人工智能QQ机器人,视频教程+源码❤️内容超级丰富,慢慢看!
  13. T SNE降维matlab程序,关于t-SNE降维方法
  14. SM74HC595D电路级联教程
  15. phpstrom中的常用快捷键
  16. oppo手机出现android什么坏了,OPPO手机提示“停止运行”怎么办 oppo停止运行的解决方法...
  17. Struts 2 studing
  18. 中值定理证明题解题思路
  19. 使用支付宝支付出现问题:交易订单处理失败 请稍后再试 ALI38173
  20. 计算机视觉与脑电数据等应用于驾驶员的疲劳状态检测综述

热门文章

  1. 网络安全威胁检测与威胁溯源_网络安全威胁2018及如何确保安全
  2. Matlab文件读写
  3. 为什么会出现失眠 什么原因导致的
  4. 生鲜电商风起云涌,店宝宝:叮咚、盒马谁能更胜一筹?
  5. 智能电网的发展和研究
  6. 有时候,细节决定成败
  7. 基于springboot mybatis网上商城系统源码和论文
  8. 离散数学——朴素集合论
  9. 智能外呼系统有什么功能?应该如何选择
  10. Python-基本统计值计算实例