POJ 2488 A Knight's Journey【DFS + 回溯】

来源:互联网 发布:2016年coc双王数据 编辑:程序博客网 时间:2024/05/16 11:59

题意

题目链接

给出一个国际棋盘的大小,骑士可以从地图的任意一个方格开始,作为起点,
问你该骑士能否走遍整张题图,并记录下其中按字典序排列的第一种路径。
经典的“骑士游历”问题。


思路分析

首先介绍一下字典序QAQ

字典序如下:
设P是1 ~ n的一个 全排列1:p = p1p2……pn = p1p2…..pj-1pj pj+1……pk-1pk pk+1……pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),
即 j = max{ i | pi< pi+1}
2)在pj的右边的数字中,找出所有比pj大的数中最小的数字pk
即 k = max{i | pi > pj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)
3)对换pj,pk
4)再用p1p2…..pj-1pj,和倒转后的 pj+1….pn (此时与k无关)组成得到,
排列p’= p1p2…..pj-1pj pn…..pj+1,这就是排列p的下一个排列。

如以132为例,
则pj = 1, pk = 2.
对换pj、pk,得231。注意此时pj = 2。
p’中 p1p2…..pj-1pj不变,将pj+1…..pn倒转后得到pn…..pj+1,
则p’=213.

  • 对于此题来说,因为是国际棋盘,所以若按字典序排列只需找字母小的,字母相同就找数字小的。

  • 要以字典序输出路径,那么搜索的方向(我的程序是path()函数)就要以特殊的顺序排列了…这样只要每次从dfs(A,1)开始搜索,第一个成功遍历的路径一定是以字典序排列…

  1. 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 ↩
0 0
原创粉丝点击