这是一个深度优先搜索DFS题目。

原题连接:2488 -- A Knight's Journey

参考资料:POJ 2488 - A Knight's Journey | 眈眈探求

参考资料:POJ2488-A Knight's Journey【骑士游历】_ζёСяêτ - 小優YoU-CSDN博客

参考资料:POJ-2488-A Knight's Journey_fuerbosi-CSDN博客

一 问题描述

骑士按照象棋中“马走日”的原则在棋盘行走,直到不重复地走完整个棋盘,并且输出“字典顺序最小”的一种路径。

已知棋盘的行列分别按数字和字母排序,为了获得“字典顺序最小”的输出路径,那么,起始点为“A1”,邻接点为其周围的8个点(为了保证字典顺序最小,这8个点的访问顺序如下图的序号1-8),其相对父节点的偏移量分别为:

dir = [[-1,-2],[1,-2],[-2,-1],[2,-1],[-2,1],[2,1],[-1,2],[1,2]]

1. 重点在于DFS的递归环节:需要清除不满足要求的父节点,并返回至上次迭代。

二 代码实现:

# POJ 2488 - A Knight's Journey
# 原题:http://poj.org/problem?id=2488
# https://exp-blog.com/algorithm/poj/poj2488-a-knights-journey/
# https://www.cnblogs.com/llhthinker/p/4924654.html
# https://www.cnblogs.com/kindleheart/p/9296931.html## 但凡涉及深度优先搜索,少不了使用递归
# 参考这个试试看:https://blog.csdn.net/iteye_8149/article/details/82369913?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
# 参考:https://blog.csdn.net/lyy289065406/article/details/6647666
import collections
## 创建一个类,可能要用到:
class Solution:def DFS(self,D_r,A_c):# 设置标志位# self.falg = 0## self.steps = 1#self.visited = set()self.visited.add(str(0)+";"+str(0))# # 定义字典,存放节点和步数# self.queue_dict = collections.defaultdict(list)# 定义#self.dfs(0,0,0)return 0def dfs(self,x,y,steps):if steps == A_c * D_r:# self.falg = 1return True# self.queue_dict[steps] = [x,y]queue_dict[steps] = [x, y]self.visited.add(str(x) + ";" + str(y))# 获得当前位置的8个邻接点,依次对每个邻接点执行深度优先搜索for i in range(8):# 这8个邻接点,按照字典顺序进行搜索,这样可以保证首先查得的路径即为按字典顺序排列的路径new_x = dir[i][0] + xnew_y = dir[i][1] + yif (0<=new_x<=D_r-1 and 0<=new_y<=A_c) and (str(new_x) +";"+str(new_y)) not in self.visited:if self.dfs(new_x,new_y,steps+1):return Trueself.visited.remove((str(x) +";"+str(y))) # 能执行到这步,说明前面跳的8步都不符合要求return False #即当前位置是错误位置,擦除记录返回上一步## 首先,接收输入
# 数据共计n组
n = int(input().strip())
# 存储接收到的n组数据
data = []
for i in range(n):R,C = map(int,input().strip().split(' '))data.append([R,C])
print(data)## 接下来,设计搜索
# 定义字典,存放节点和步数
queue_dict = collections.defaultdict(list)
# 定义邻接点的搜寻顺序,按照字典顺序进行搜寻
dir = [[-1,-2],[1,-2],[-2,-1],[2,-1],[-2,1],[2,1],[-1,2],[1,2]]
for i in range(n):# 分别处理每一组数据D_r,A_c = data[i][0],data[i][1]# 设置标志位test = Solution()test.DFS(D_r,A_c)if len(queue_dict)== D_r*A_c:print("Scenario #"+str(i+1)+":")res = ''for j in range(len(queue_dict)):res += chr(queue_dict[j][1]+ord('A')) + str(queue_dict[j][0]+1)# 棋盘中的行为数字,从1开始;棋盘中的列为字母,从A开始print(res)if i!=n-1:print() # 打印空行else:print("Scenario #" + str(i+1) + ":")print("impossible")if i!=n-1:print()

输入:

3
1 1
2 3
4 3

输出:

Scenario #1:
A1Scenario #2:
impossibleScenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4

POJ 2488 - A Knight‘s Journey + Python相关推荐

  1. POJ 2488 A Knight's Journey (棋盘DFS)

    A Knight's Journey   大意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 1 #include <map> 2 #in ...

  2. poj - 2488 A Knight's Journey

    走马步,求能否遍历棋盘上所有格,如能,按最小字典序输出路径. 做这题时我又看了下以前写的poj 2676,把代码又改进了下. 1 #include <stdio.h> 2 #include ...

  3. POJ 2488 A Knight's Journey

    题意:给一个n×m的棋盘,如果一个骑士可以从任意一个位置出发不重复的走遍棋盘的每个格子就输出字典序最短的路径. 解法:dfs.暴搜n×m次,只是被字典序输出坑了--而且字母是列序号数字是行序号--这两 ...

  4. TOJ 1702.A Knight's Journey

    2015-06-05 问题简述: 有一个 p*q 的棋盘,一个骑士(就是中国象棋里的马)想要走完所有的格子,棋盘横向是 A...Z(其中A开始 p 个),纵向是 1...q. 原题链接:http:// ...

  5. A Knight‘s Journey(POJ-2488)

    A Knight's Journey 题目 题目大意 题目思路 代码 题目 Description Background The knight is getting bored of seeing t ...

  6. OpenJudge NOI 2.5 1490:A Knight‘s Journey

    [题目链接] OpenJudge NOI 2.5 1490:A Knight's Journey 疑问:题目说可以从任意点出发,以任意点结束.为什么我看他人的代码中,只写从(1,1)出发的情况也能过呢 ...

  7. 【poj 2488】A Knight's Journey 中文题意题解代码(C++)

    题目链接: http://poj.org/problem?id=2488 中文题意: 给出一个p行q列的国际棋盘,马可以从任意一个格子开始走,问马能否不重复的走完所有的棋盘.如果可以,输出按字典序排列 ...

  8. Poj(2488),按照字典序深搜

    题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...

  9. POJ 2243:Knight Moves(双向BFS)

    http://poj.org/problem?id=2243 问题概述:一个8*8的棋盘,给定一个起点(列a-h,行1-8)和一个终点(列a-h,行1-8),按骑士的走法(走日字),从起点到 终点最少 ...

最新文章

  1. Charles是mac的iddler抓包工具
  2. BASH启动脚本及其启动顺序
  3. Android 监听手机GPS打开状态
  4. mysql数据库云读取_云数据库 MySQL版
  5. php设置session 生命周期,php会话(session)生命周期概念介绍及设置更改和回收
  6. 爬取常用的网站,整理成API:中国联通,大众点评,IT桔子,拉勾网,猫眼电影,人人贷......
  7. 谷歌 Daydream VR 开发工具
  8. wince6.0升级7.0系统_一个WINCC项目升级的案例分享
  9. 故障常见原因归类分析及预防和应对措施
  10. java 出栈_Java开发中巧妙使用链表来实现模拟栈的入栈出栈操作
  11. Ant for Vue - input、select组件placeholder无法显示
  12. 浅谈Oracle执行计划
  13. C语言模拟信号量解决同步、互斥问题
  14. 华为毕昇JDK8的改进,效果很一般
  15. Android的硬件缩放技术优化执行效率 Screen.SetResolution
  16. 计算机内存条能装几个,电脑能装几个内存条_一般电脑插几个内存条
  17. 飞猪双11成绩单背后 藏了什么玄机
  18. planetarium - 在你的网站上构建交互式宇宙星球动画
  19. Android学习之Android历史
  20. HDU1849 SG函数

热门文章

  1. Vue 百度富文本编辑器Ueditor Spring Boot 前后台整合示例(附带完整源码)
  2. RedisManager使用手册(四)-- 集群创建(Docker) 1
  3. AngularJS 整理学习
  4. 香港IT人的工作情况~
  5. (视频)小儒尼尼奥绝妙任意球 S型轨迹C罗亦难及+最新上传经典任意球集合
  6. 环形磁铁磁场公式推导
  7. 做个问答社区要多久?这个开源项目直接拿去用!
  8. 使用Ghost恢复系统时提高运行速度的绝招(转)
  9. 疫苗预约管理系统,疫苗预约系统,新冠疫苗预约系统毕业设计作品
  10. 设计模式 之 责任链模式