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)的更多相关文章

  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. [转帖]使用systemd-analyze 工具来分析各个服务进程的启动性能

    https://www.cnblogs.com/xingmuxin/p/11413784.html systemd-analyze是一个分析启动性能的工具,用于分析启动时服务时间消耗.默认显示启动是内 ...

  2. [转帖][大数据]ETL之增量数据抽取(CDC)

    https://www.cnblogs.com/johnnyzen/p/12781942.html 目录 1 CDC 概念 1.1 定义 1.2 需求背景 1.3 考察指标 2 CDC 常见解决方案 ...

  3. ebpf 单行程序学习

    ebpf 单行程序学习 背景 公司方神借给我一本: <BPF之巅:洞悉linux系统和应用性能>纸质书 拿回家晚上在沙发上看了几天. 感觉书很厚看的不是很系统. 仅能凭自己的感觉总结一下这 ...

  4. [转帖]磁盘负载指标 %iowait, await, %util 的正确理解

    说明 %iowait, await, %util 是用来衡量硬盘负载的三个指标, 但是这几个指标通常容易被误解, 实际上, 这三个指标单纯的高, 并不一定能说明相应的磁盘有问题或者有瓶颈, 而是需要结 ...

  5. F5内核参数的简要学习

    前言 最近学习了很长时间的Linux内核参数 但是大部分是纸上谈兵. 也没有一个好的系统用于学习和参照 晚上搜索F5资料时发现F5有一些iso和ova文件 就想着下载学习一下. 看看F5系统默认的参数 ...

  6. 真·Android Zxing 扫码中文乱码解决

    Zxing3.2.1 之前遇到过Android Zxing扫码乱码的问题,网上搜了下解决了下. 今天又遇到了问题. 依然会乱码. 研究总结如下: Zxing 可以在Hints中添加默认编码格式.这个编 ...

  7. 【解决了一个小问题】macbook m1上的docker build问题

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1. docker hub限制的问题 因为docker b ...

  8. go中channel源码剖析

    channel 前言 设计的原理 共享内存 csp channel channel的定义 源码剖析 环形队列 创建 写入数据 读取数据 channel的关闭 优雅的关闭 M个receivers,一个s ...

  9. GPT大语言模型引爆强化学习与语言生成模型的热潮、带你了解RLHF。

    GPT大语言模型引爆强化学习与语言生成模型的热潮.带你了解RLHF. 随着 ChatGPT 的爆火,强化学习(Reinforcement Learning)和语言生成模型(Language Model ...

  10. 【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)

    1.分布式训练简介 分布式训练的核心目的: 加快模型的训练速度.通过对训练任务按照一定方法拆分分配到多个计算节点进行计算,再按照一定的方法对需要汇总的信息进行聚合,从而实现加快训练速度的目的. 1.1 ...