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. Clickhouse的极简安装-之二(macos+linux)

    Clickhouse的极简安装-之二(macos+linux) StudyFrom https://clickhouse.com/docs/en/install 然后简单的获取方式: curl htt ...

  2. [转帖]在麒麟linux上安装Postgresql12.5

    https://jimolonely.github.io/tech/linux/install-postgresql-kylin/ 本文主要实践在麒麟V10版本上通过源码编译安装PostgreSQL1 ...

  3. [转帖]【软件测试】Jmeter性能测试(性能测试,Jmeter使用与结果分析)

    文章目录 前言 一.性能测试 1. 什么是性能测试? 2. 性能测试的重要性 3. 性能指标--QPS和TPS ①QPS ②TPS 二.压测工具Jmeter 1. 什么是Jmeter? 2. Jmet ...

  4. [转帖]sqlplus与shell互相传值的几种情况

    https://www.cnblogs.com/youngerger/p/9068888.html sqlplus与shell互相传值的几种情况 情况一:在shell中最简单的调用sqlplus $c ...

  5. 【转帖】nginx变量使用方法详解-6

    https://www.diewufeiyang.com/post/580.html Nginx 内建变量用在"子请求"的上下文中时,其行为也会变得有些微妙. 前面在 (三) 中我 ...

  6. [转帖]【Redis】Redis中使用Lua脚本

    Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua具体语法参考:https://www.runoob. ...

  7. [转帖]a.out、coff、elf三种文件格式

    补充:a.out早期并不是elf格式的,而是unix下另一种可执行格式,新的a.out是 本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and li ...

  8. [转帖] Linux命令拾遗-文本处理篇

    https://www.cnblogs.com/codelogs/p/16060413.html 简介# 这是Linux命令拾遗系列的第二篇,本篇主要介绍Linux中与文本处理相关的命令,如xargs ...

  9. 使用systemd管理多nginx服务以及单nginx服务实现多vhost访问的操作步骤

    背景 nginx是开源的web服务器, 性能与可配置性和插件做的非常完善. 可以使用简单的命令拉起来nginx进行服务提供,但是有时候需要使用keepalive等软件实现保活,以及实现开启启动等,比较 ...

  10. 每日一库:Memcache

    Memcache 是一个高性能.分布式的内存缓存系统,常用于缓存数据库查询结果.API调用结果.页面内容等,以提升应用程序的性能和响应速度.下面详细介绍一些 Memcache 的特点和使用方式: 内存 ...