DFS算法(C++版本)

题目一:

链接:http://bailian.openjudge.cn/practice/2488/

解析思路:

骑士找路就是基本的DFS,用递归不断找到合适的路,找不到就回头直到找到合适的路。

该题难点:要是实现字典序,也就是同样的两种选择,要走到A1而不是B1。所以就有了{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}寻路时走路的尝试走路顺序。注意:我的程序输入的行(m)是表示的数字,列(n)表示的是字母这也是为什么尝试走路的顺序是列小的排在前面优先选择。

代码思路:

根据每次输入的m和n构建棋盘,visit数组默认是全为0,visit数组是棋盘的位置是1,然后经过DFS,走过的棋盘点在visit数组对应的位置置为2,不走走过的棋盘点也就是visit数组是2的点。用road数组记录如果成功走完了棋盘的路径,如果road数组的元素个数不等于m*n(棋盘点的个数),输出impossible,否则输出road数组。完工!!!!!!!!!!!!!!!!!!!

代码实现:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. //骑士之旅 http://bailian.openjudge.cn/practice/2488/
  5. //右(上)上 {1,2} 右(下)上 {2,1}
  6. //右(上)下 {2,-1} 右(下)下 {1,-2}
  7. //左(上)上 {-1,2} 左(下)上 {-2,1}
  8. //左(上)下 {-2,-1} 左(下)下 {-1,-2}
  9. char alf[27] = { '0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
  10. int number[10] = { 0,1,2,3,4,5,6,7,8,9 };
  11. int visit[11][11];//棋盘点 1表示棋盘 2走过的棋盘点
  12. int road[40];//走的路线 十位表示行 个位表示列
  13. int freq;//用于记录有多少次的输出
  14. int step = 0; //走过了多少步
  15. char re_sign;//0表示没走到头 1表示走到头了
  16. void ways(int i, int j, int m, int n)
  17. {
  18. //走过的路
  19. visit[i][j] = 2;
  20. road[step++] = (i + 1) * 10 + (j + 1);//除去i和j为0的情况
  21. //走通了
  22. if (step == m * n)
  23. {
  24. re_sign = 1;
  25. return;
  26. }
  27. //走路的操作
  28. // 数字+字母 字母的字典序优先(A7>B1)
  29. //{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}
  30. if (i - 1 >= 0 && j - 2 >= 0 && visit[i - 1][j - 2] == 1)
  31. ways(i - 1, j - 2, m, n);
  32. if (i + 1 < m && j - 2 >= 0 && visit[i + 1][j - 2] == 1)
  33. ways(i + 1, j - 2, m, n);
  34. if (i - 2 >= 0 && j - 1 >= 0 && visit[i - 2][j - 1] == 1)
  35. ways(i - 2, j - 1, m, n);
  36. if (i + 2 < m && j - 1 >= 0 && visit[i + 2][j - 1] == 1)
  37. ways(i + 2, j - 1, m, n);
  38. if (i - 2 >= 0 && j + 1 < n && visit[i - 2][j + 1] == 1)
  39. ways(i - 2, j + 1, m, n);
  40. if (i + 2 < m && j + 1 < n && visit[i + 2][j + 1] == 1)
  41. ways(i + 2, j + 1, m, n);
  42. if (i - 1 >= 0 && j + 2 < n && visit[i - 1][j + 2] == 1)
  43. ways(i - 1, j + 2, m, n);
  44. if (i + 1 < m && j + 2 < n && visit[i + 1][j + 2] == 1)
  45. ways(i + 1, j + 2, m, n);
  46. if (re_sign == 1)
  47. {
  48. return;
  49. }
  50. //路走不通,把road还原(waiting)
  51. visit[i][j] = 1;//恢复棋盘点
  52. road[--step] = 0;//把原来记录走路的点恢复,再Sn减1==现走了几步
  53. }
  54. int main()
  55. {
  56. //要将要输入几组数据
  57. int t;
  58. cin >> t;
  59. while (t--)
  60. {
  61. int m, n;
  62. cin >> m >> n;// m 字母(A B C D) n 数字(1 2 3 4)
  63. cout << "Scenario #" << ++freq << ":" << endl; //打印序号
  64. if (m == 0 && n == 0)//输入错误信息
  65. {
  66. cout << "这样子的棋盘不存在" << endl;
  67. continue;
  68. }
  69. //初始化
  70. step = 0;
  71. re_sign = 0;
  72. memset(road, 0, sizeof(road));
  73. memset(visit, 0, sizeof(visit));
  74. //只考虑在A1开始寻路的情况
  75. for (int i = 0; i < m; ++i)
  76. {
  77. for (int j = 0; j < n; ++j)
  78. {
  79. visit[i][j] = 1;
  80. }
  81. }
  82. ways(0, 0, m, n);//起始点开始DFS
  83. //结果输出
  84. if (step == m * n)
  85. {
  86. for (int i = 0; i < step; i++)
  87. {
  88. //输出走过的路
  89. cout << alf[road[i] % 10] << number[road[i] / 10];
  90. }
  91. cout << endl<<endl;
  92. }
  93. else
  94. {
  95. cout << "impossible"<<endl<<endl;
  96. }
  97. }
  98. }

运行结果:

DFS算法模板(2488:A Knight's Journey)的更多相关文章

  1. POJ 2488 -- A Knight's Journey(骑士游历)

    POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的“骑士游历”问题 ...

  2. DFS 算法模板

    dfs算法模板: 1.下一层是多节点的dfs遍历 def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) ...

  3. POJ 2488 A Knight's Journey(DFS)

    A Knight's Journey Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 34633Accepted: 11815 De ...

  4. POJ 2488 A Knight's Journey(深搜+回溯)

    A Knight's Journey Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) ...

  5. DFS算法(——模板习题与总结)

    首先,需要说明的是搜索算法本质上也是枚举的一种,时间复杂度还是很高的,遇到问题(特别是有水平的比赛上),不要优先使用搜索算法. 这里总结一下DFS算法: 1.从图中某个顶点出发,访问v. 2.找出刚访 ...

  6. [poj]2488 A Knight's Journey dfs+路径打印

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45941   Accepted: 15637 Description Bac ...

  7. poj 2488 A Knight's Journey( dfs )

    题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...

  8. poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】

    题目地址:http://poj.org/problem?id=2488 Sample Input 3 1 1 2 3 4 3 Sample Output Scenario #1: A1 Scenari ...

  9. POJ 2488 A Knight's Journey【DFS】

    补个很久之前的题解.... 题目链接: http://poj.org/problem?id=2488 题意: 马走"日"字,让你为他设计一条道路,走遍所有格,并输出字典序最小的一条 ...

  10. POJ 2488 A Knight's Journey (DFS)

    poj-2488 题意:一个人要走遍一个不大于8*8的国际棋盘,他只能走日字,要输出一条字典序最小的路径 题解: (1)题目上说的"The knight can start and end ...

随机推荐

  1. [转帖]为什么 Java 内部使用 UTF-16 表示字符串?

    https://www.jianshu.com/p/957b249a02d8 背景 许多年前 Unicode 的提出者天真地以为 16 位定长的字符可以容纳地球上所有仍具活力的文字,Java 设计者也 ...

  2. [转帖]TiUP 常见运维操作

    https://docs.pingcap.com/zh/tidb/stable/maintain-tidb-using-tiup 本文介绍了使用 TiUP 运维 TiDB 集群的常见操作,包括查看集群 ...

  3. 【转帖】dl.google.com的国内镜像源

    dl.google.com不能访问 1.通过https://ping.chinaz.com/解析出dl.google.com的国内代理 2.C:\Windows\System32\drivers\et ...

  4. HotSpare 9361Raid卡热备盘的设置过程

    HotSpare 9361Raid卡热备盘的设置过程 摘要 公司最近一批服务器到位(去年生产) 插满24盘位的 960G 的SSD 的超融合服务器. (硬盘是镁光的 !-_-!) 想着Raid6虽然数 ...

  5. [转帖]Windows自带硬盘测试工具使用教程

    本教程主要讲解Windows自带的硬盘测试工具的使用,不用再安装第三方软件了.到底准不准就不知道啦,下面我们来看看如何使用吧~ 1. 进入cmd 快速进入cmd 主要如果进入后,使用命令直接闪退,就是 ...

  6. echarts设置暂无数据

    场景描述 我们在项目中,很多时候都会使用echarts进行数据展示. 当没有数据的时候,echarts的展示就会特别的难看. 这个时候我们就会优化界面的显示,在echarts中展示暂无数据. 有很多中 ...

  7. Ant Design Vue照片墙a-upload

    <template> <div class="clearfix"> {{ fileList }} <a-upload list-type=" ...

  8. echarts多条折线图hover的时候添加单位

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  10. 搭建mongo的replica set

    搭建mongo的replica set 前言 安装 构建副本集 加入认证 备份数据 备份数据到本地 数据恢复 搭建mongo的replica set 前言 准备三台机器,相互可以访问的.处理思路,先构 ...