2月19日,多云。“小楼一夜听春雨,深巷明朝卖杏花“。 例1:输入一个数n,按字典序从小到大的顺序输出1~n的全排列。两个序列的字典序大小关系等价于从开始的第一个不相同位置处的大小关系。例如,(1,3,2) <
(2,1,3)
当n = 3时,所有排序的排序结果是(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1)。
输出: 从问题的某一种可能出发,搜索从这种情况出发所能达到的所有可能, 当这一条路走到“ 尽头 ”而没达到目的地的时候, 再倒回上一个出发点, 从另一个可能出发, 继续搜索. 这种不断“倒回 一步"寻找解的方法, 称作" 回溯法 "。
为师给出算法框架,悟空,还是你来实现以下。
1.procedure
dfs(step:integer)
2.begin
3. if
到达边界状态 then 输出解;
4. else for i:= 1 to n do //顺次尝试每一种可能
5.
begin
6.
if 满足条件 then
7.
begin
8. 保存结果;
9. dfs(step+1);
10. 恢复:保存结果之前的状态
11. end;
12.
end;
13.end;
14.Begin
15.
dfs(1);
16.end.
结果:2 1 2 2 1 3 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 大家都知道,深度优先的主要思想就是“不撞南墙不回头”,“一条路走到黑”,如果遇到“墙”或者“无路可走”时再去走下一条路。所以先规定好一个走路的规则,比如就按照右下左上顺时针的方式去尝试。 HDU 1016 Prime Ring Problem是一道简单的搜索题,简单说就是一位一位去试,一位一位地填上数字,看是否满足条件,具体看注释。
|
|