1.关于搜索问题,DFS是没有一个固定的模板的,但是也可以进行一下总结
DFS stack O(n) 没有固定模板(但是有一般思路) 适用于对空间要求较高
BFS queue O(2^n) 有固定模板 有最短性质(对各边权重为1的时候)
2.DFS函数书写思路伪代码:
void DFS (数据类型 参数,数据类型 参数)
{
if (出口条件) 输出;
for(搜索深度)if (新点) 新点赋值;标记为旧点;递归下一层;回溯处理(数值恢复,新旧状态恢复);
}
3.BFS函数书写思路伪代码:
queue<——初始化
|
while(queue)
{
auto t <——队头元素
|
拓展 t 的所有距离为1 的邻点 x :if ( x 为走过&&可以走)x入队,更新距离数组
}
4.DFS实战分析:
842. 排列数字
给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤71≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
第一次思路:
1.确定搜索类型 DFS因为从数据规模看,这是个n(n!),从题目描述,也没有最短路性质字眼描述,试了一下,觉得好搞,BFS明显是一层一层搜的,不怎么合适
2.先找出搜索顺序 n个空位,每个空位进行搜索
3.确定搜索树 画出来了。
4.剪枝优化 暂时没想到,觉得也剪不掉,题目思路比较清晰
那就开始第一次尝试
#include<iostream>
没写完,觉得这样写性价比不高,时间很大一部分在这个文档排版上了,不划算。占坑,后面来弄