POJ 2488 - A Knight‘s Journey + Python
这是一个深度优先搜索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相关推荐
- POJ 2488 A Knight's Journey (棋盘DFS)
A Knight's Journey 大意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 1 #include <map> 2 #in ...
- poj - 2488 A Knight's Journey
走马步,求能否遍历棋盘上所有格,如能,按最小字典序输出路径. 做这题时我又看了下以前写的poj 2676,把代码又改进了下. 1 #include <stdio.h> 2 #include ...
- POJ 2488 A Knight's Journey
题意:给一个n×m的棋盘,如果一个骑士可以从任意一个位置出发不重复的走遍棋盘的每个格子就输出字典序最短的路径. 解法:dfs.暴搜n×m次,只是被字典序输出坑了--而且字母是列序号数字是行序号--这两 ...
- TOJ 1702.A Knight's Journey
2015-06-05 问题简述: 有一个 p*q 的棋盘,一个骑士(就是中国象棋里的马)想要走完所有的格子,棋盘横向是 A...Z(其中A开始 p 个),纵向是 1...q. 原题链接:http:// ...
- A Knight‘s Journey(POJ-2488)
A Knight's Journey 题目 题目大意 题目思路 代码 题目 Description Background The knight is getting bored of seeing t ...
- OpenJudge NOI 2.5 1490:A Knight‘s Journey
[题目链接] OpenJudge NOI 2.5 1490:A Knight's Journey 疑问:题目说可以从任意点出发,以任意点结束.为什么我看他人的代码中,只写从(1,1)出发的情况也能过呢 ...
- 【poj 2488】A Knight's Journey 中文题意题解代码(C++)
题目链接: http://poj.org/problem?id=2488 中文题意: 给出一个p行q列的国际棋盘,马可以从任意一个格子开始走,问马能否不重复的走完所有的棋盘.如果可以,输出按字典序排列 ...
- Poj(2488),按照字典序深搜
题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...
- POJ 2243:Knight Moves(双向BFS)
http://poj.org/problem?id=2243 问题概述:一个8*8的棋盘,给定一个起点(列a-h,行1-8)和一个终点(列a-h,行1-8),按骑士的走法(走日字),从起点到 终点最少 ...
最新文章
- php cookie删除不了,php cookie删除不了怎么办
- 一个指针的引用引发的血案
- 高斯曲率求表面极值点
- 女子800米跑进4分30秒才合格,茅台回应应聘者需体测...
- 用微软的压力测试工具进行拒绝服务攻击
- 聊聊flink JobManager的High Availability
- h5页面预览pdf文件_H5怎么实现在线预览PDF
- excel批量删除单元格中的部分内容
- 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇
- 微信公众号图文如何添加PDF附件
- 游戏盾能防住几T的攻击吗
- 计算机学院优秀主讲教师评选细则,徐州工程学院优秀主讲教师评选办法 徐工院行教[2015]35号...
- oracle模板数据文件,Oracle EBS如何通过命令上传XML/BI Publisher数据定义文件和模板文件...
- icloud 照片导出_我的照片流和iCloud照片之间有什么区别?
- flutter报错: [!] Automatically assigning platform `iOS` with version `8.0` on target `Runner` becaus
- NOIP刷题记录(打鼹鼠)——二维树状数组板子题
- python脚本转lua_从Python运行Lua脚本
- 数据自动备份软件哪个好?
- excel导入sas卡方检验
- Shell脚本之TCP端口扫描器