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. [转帖]Linux命令之——rsync

    文章目录 1 rsync是干什么用的 2 rsync和scp有什么区别 3 rsync简单用法介绍 rsync四种工作方式 1. 本地文件系统上实现同步 2. 本地主机使用远程shell和远程主机通信 ...

  2. [转帖]mysql 数据库视图迁移

    https://www.cnblogs.com/phpyangbo/p/6132821.html 最近做一个项目,为了方便查询,建了好多的视图表,正式上线的时候需要把本地数据库迁移到服务器上. 按照常 ...

  3. [转帖]Grafana+influxdb+ntopng简易网络流量分析展示系统

    Grafana逼格高,所以用它展示ntopng的数据 >_< 一,ntopng 根据官网资料 https://www.ntop.org/ntop/ntopng-influxdb-and-g ...

  4. 一键部署Docker中间件简单方法-redis为例

    一键部署Docker中间件简单方法-redis为例 背景 想能够快速部署一些中间件. 写文档虽然可以, 但是总会有人问, 能够一键部署应该最好不过. 下载以及导出镜像 docker pull redi ...

  5. [转帖]【VIM】多行缩进空格与删除

    向前或向后缩进一个TAB 按ctrl + v组合键进入Visual Line模式,可使用方向键选择多行: 按<或>,进行向前或向后缩进tab. 缩进n个TAB,按n+<或> 多 ...

  6. [转帖]PostgreSQL(三) 内存参数优化和原理(work_mem)内存表 pgfincore插件使用方法

    1.常用内存参数 1.1 shared_buffers shared_buffers是PostgreSQL用于共享缓冲区的内存,是由8kb大小的块所形成的数组.PostgreSQL在进行更新.查询等操 ...

  7. [转帖] 如何kill一条TCP连接?

    https://www.cnblogs.com/codelogs/p/16838850.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果你的程序写 ...

  8. [官方]Beyond Compare里面 二进制比较的含义.

    Content Comparisons Actions > Compare Contents In the Actions menu, the Compare Contents command ...

  9. 商智C店H5性能优化实战

    前言 商智C店,是依托移动低码能力搭建的一个应用,产品面向B端商家.随着应用体量持续增大,考虑产品定位及用户体验,我们针对性能较差页面做了一次优化,并取得了不错的效果,用户体验值(UEI)从一般提升到 ...

  10. 京东金融APP-新交互技术“虚拟数字人”赋能世界杯主题营销

    作者:平台研发部,智能服务与产品部 距离加文·伍德提出web3.0已经过去8年时间,这8年加文·伍德创建的以太坊大放异彩,同时由web3.0引出的数字人.元宇宙也生根发芽,茁壮成长,带来了非凡的用户体 ...