DFS算法模板(2488:A Knight's Journey)
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数组。完工!!!!!!!!!!!!!!!!!!!
代码实现:
#include<iostream>
#include<cstring>
using namespace std;
//骑士之旅 http://bailian.openjudge.cn/practice/2488/
//右(上)上 {1,2} 右(下)上 {2,1}
//右(上)下 {2,-1} 右(下)下 {1,-2}
//左(上)上 {-1,2} 左(下)上 {-2,1}
//左(上)下 {-2,-1} 左(下)下 {-1,-2}
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' };
int number[10] = { 0,1,2,3,4,5,6,7,8,9 };
int visit[11][11];//棋盘点 1表示棋盘 2走过的棋盘点
int road[40];//走的路线 十位表示行 个位表示列
int freq;//用于记录有多少次的输出
int step = 0; //走过了多少步
char re_sign;//0表示没走到头 1表示走到头了
void ways(int i, int j, int m, int n)
{
//走过的路
visit[i][j] = 2;
road[step++] = (i + 1) * 10 + (j + 1);//除去i和j为0的情况
//走通了
if (step == m * n)
{
re_sign = 1;
return;
}
//走路的操作
// 数字+字母 字母的字典序优先(A7>B1)
//{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}
if (i - 1 >= 0 && j - 2 >= 0 && visit[i - 1][j - 2] == 1)
ways(i - 1, j - 2, m, n);
if (i + 1 < m && j - 2 >= 0 && visit[i + 1][j - 2] == 1)
ways(i + 1, j - 2, m, n);
if (i - 2 >= 0 && j - 1 >= 0 && visit[i - 2][j - 1] == 1)
ways(i - 2, j - 1, m, n);
if (i + 2 < m && j - 1 >= 0 && visit[i + 2][j - 1] == 1)
ways(i + 2, j - 1, m, n);
if (i - 2 >= 0 && j + 1 < n && visit[i - 2][j + 1] == 1)
ways(i - 2, j + 1, m, n);
if (i + 2 < m && j + 1 < n && visit[i + 2][j + 1] == 1)
ways(i + 2, j + 1, m, n);
if (i - 1 >= 0 && j + 2 < n && visit[i - 1][j + 2] == 1)
ways(i - 1, j + 2, m, n);
if (i + 1 < m && j + 2 < n && visit[i + 1][j + 2] == 1)
ways(i + 1, j + 2, m, n);
if (re_sign == 1)
{
return;
}
//路走不通,把road还原(waiting)
visit[i][j] = 1;//恢复棋盘点
road[--step] = 0;//把原来记录走路的点恢复,再Sn减1==现走了几步
}
int main()
{
//要将要输入几组数据
int t;
cin >> t;
while (t--)
{
int m, n;
cin >> m >> n;// m 字母(A B C D) n 数字(1 2 3 4)
cout << "Scenario #" << ++freq << ":" << endl; //打印序号
if (m == 0 && n == 0)//输入错误信息
{
cout << "这样子的棋盘不存在" << endl;
continue;
}
//初始化
step = 0;
re_sign = 0;
memset(road, 0, sizeof(road));
memset(visit, 0, sizeof(visit));
//只考虑在A1开始寻路的情况
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
visit[i][j] = 1;
}
}
ways(0, 0, m, n);//起始点开始DFS
//结果输出
if (step == m * n)
{
for (int i = 0; i < step; i++)
{
//输出走过的路
cout << alf[road[i] % 10] << number[road[i] / 10];
}
cout << endl<<endl;
}
else
{
cout << "impossible"<<endl<<endl;
}
}
}
运行结果:

DFS算法模板(2488:A Knight's Journey)的更多相关文章
- POJ 2488 -- A Knight's Journey(骑士游历)
POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的“骑士游历”问题 ...
- DFS 算法模板
dfs算法模板: 1.下一层是多节点的dfs遍历 def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) ...
- POJ 2488 A Knight's Journey(DFS)
A Knight's Journey Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 34633Accepted: 11815 De ...
- POJ 2488 A Knight's Journey(深搜+回溯)
A Knight's Journey Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) ...
- DFS算法(——模板习题与总结)
首先,需要说明的是搜索算法本质上也是枚举的一种,时间复杂度还是很高的,遇到问题(特别是有水平的比赛上),不要优先使用搜索算法. 这里总结一下DFS算法: 1.从图中某个顶点出发,访问v. 2.找出刚访 ...
- [poj]2488 A Knight's Journey dfs+路径打印
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45941 Accepted: 15637 Description Bac ...
- poj 2488 A Knight's Journey( dfs )
题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...
- 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 ...
- POJ 2488 A Knight's Journey【DFS】
补个很久之前的题解.... 题目链接: http://poj.org/problem?id=2488 题意: 马走"日"字,让你为他设计一条道路,走遍所有格,并输出字典序最小的一条 ...
- POJ 2488 A Knight's Journey (DFS)
poj-2488 题意:一个人要走遍一个不大于8*8的国际棋盘,他只能走日字,要输出一条字典序最小的路径 题解: (1)题目上说的"The knight can start and end ...
随机推荐
- [转帖]Redis重大版本整理(Redis2.6-Redis7.0)
Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7.2.9.3.1),若是是偶数,则为稳定版本(例如2.6.2.8.3.0.3.2). ...
- [转帖]解决Java/MySQL性能问题的思路
https://plantegg.github.io/2023/08/28/%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98%E6%80%9D%E8%B7%AF/ 10年前写的 ...
- [转帖]python库Paramiko
https://zhuanlan.zhihu.com/p/456447145 测试过程中经常会遇到需要将本地的文件上传到远程服务器上,或者需要将服务器上的文件拉到本地进行操作,以前安静经常会用到xft ...
- [转帖]关于iostat的问题,svctm数据不可信
使用FIO对磁盘进行压力测试,使用1个线程对磁盘进行随机读,设置单次read的数据块分别为128KB和1M,数据如下: (1)单次IO数据块为128KB (2)单次IO数据块为1M 从上面的数据可以看 ...
- 结论&定理大全
定理 1:包含 \(0\) 与 \(2^k-1\) 的按位与或空间和 \(k\) 个点的有传递性的有向图形成双射 证明: 空间->传递闭包:对于任意两个位 \(i,j\),若某个数包含 \(i\ ...
- TypeScript中typeof的简单介绍
简单介绍typeof 我们都知道js提供了typeof,用来获取基本数据的类型. 实际上,TS也提供了 typeof 操作符. 可以在 [类型上下文]中进行类型查询. 只能够进行变量或者属性查询. 定 ...
- vue如何获取动态添加的类
动态添加的类.你在声明周期中的mounted中是拿不到的. 是有在updata这个声明周期中才可以拿到的. 因为此时数据才跟新完成
- 【解决一个小问题】macbook m2 上交叉编译 gozstd
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 已知 zstd 是一个优秀的压缩库,gozstd封装了这个 ...
- 如何在IntelliJ IDEA中运行Java/Scala/Spark程序
本文将分两部分来介绍如何在IntelliJ IDEA中运行Java/Scala/Spark程序: 基本概念介绍 在IntelliJ IDEA中创建和运行java/scala/spark程序 基本概念介 ...
- Unity的asm笔记
使用asm的好处 减少修改C#后unity编译dll的时间,对于项目中的C#代码越多效果越明显,比如我们的一个3dmmo项目是纯C#开发,每次修改C#后编译时间就要26s以上 在Unity2018.2 ...