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 ...
随机推荐
- [转帖]2024年正常使用windows XP之一:系统下载篇
https://zhuanlan.zhihu.com/p/347764175 半夏:2024年正常使用windows XP之一:系统下载篇 半夏:2024年正常使用windows XP之二:补丁及运行 ...
- [转帖]linux中的set -e 与set -o pipefail
https://www.cnblogs.com/xingmuxin/p/8431970.html 1.set -e "Exit immediately if a simple command ...
- [转帖]Linux命令学习手册-readelf
https://www.jianshu.com/p/405844abefae readelf elf-file(s) 功能 用于显示 elf 格式文件的信息. 描述 readelf 用来显示一个或者多 ...
- ESXi6.7安装Win11的方法
背景 公司里面要进行新的操作系统验证了. 之前Win10 Win7 Win8 都比较简单. 就是现在Win11有了TPM非常繁琐. 今天必须得搞一把了,就简单搜索了下. 发现还是可以解决的. 然后记录 ...
- zabbix基于容器化在UOS1050E上面的安装与使用
前言 想着能够监控一下操作系统的日志. 因为国产化的需求, 所以我这边使用了UOS1050E 安装zabbix时多次提示缺少php-json 或者是缺少一些libevent等组件. 自己尝试进行解决发 ...
- 手写promise异步状态修改then方法返回来的结果
看看下面这一段代码返回来的是什么??? <body> <script type="text/javascript"> let p = new Promise ...
- vue3中provide和inject的使用
1.provide 和 inject 的讲解 provide和inject可以实现嵌套组件之间进行传递数据. 这两个函数都是在setup函数中使用的. 父级组件使用provide向下进行传递数据: 子 ...
- win10家庭版禁用更新
前言 2020年初因为疫情在家远程办公,而我老家没有电脑,先后向两位大学生借了两台电脑来办公,发现一个现象:他们的电脑系统都是家庭版,也就是刚买电脑时安装的win10家庭版.也问了其它几位计算机专业的 ...
- MybatisPlus对Mysql数据库关键字作为列名的处理--SQLSyntaxErrorException: You have an error in your SQL syntax;
说明: 在设计数据库时,使用mysql关键字作为列名(比如order用于排序),就会报错:java.sql.SQLSyntaxErrorException: You have an error in ...
- 搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战
搜索推荐DeepFM算法详解:算法原理.代码实现.比赛实战 可以说,DeepFM 是目前最受欢迎的 CTR 预估模型之一,不仅是在交流群中被大家提及最多的,同时也是在面试中最多被提及的: 1.Deep ...