来弥补一篇博文。
相信在做dl们都知道并且用过dfs吧,他跟bfs有什么区别?
通俗一点来讲就是dfs好用,代码量少,但是理解难度极大
bfs不好用,代码量多,但是理解单独简直超简单。
下面重点来了
重点啊,划重点划重点
dfs和bfs的用处何在?
dfs是在用求连通块面积的,
bfs是在用求连通块数量的。
哈我到底在说啥,说的就是八个字:“dfs好用!!!”
那你还是可能不知道我要干啥,别急别急,看标题
P1706 全排列问题
唉这就是重点吗,看起来只需要一个循环就能搞定的事情,实则没那么简单。
题中明说按照字典序输出自然数 11 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。哦全排列懂了吧。你知道要用什么吗?dfs!!!
我的思路是这样的,最近有一个粉丝宝宝给我说我需要添加一个输出函数,但是我觉得这个题中就不需要那么麻烦,那什么能让我们又快又nice的完成这道题呢,萌新们在int main里写循环我很理解,但是像我们这种高手需要吗?不需要,我们用函数来写有问题吗?没有问题。
上代码
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
const int N=9;
int v[N+2],a[N+2],n;//二数组一变量,简单环保
void dfs(int);//dfs函数登场喽
int main()
{
cin>>n;
dfs(0);//逐步进入到dfs函数
return 0;
}
void dfs(int stp){//开始进入到dfs运算中
if(stp==n){
for(int i=0;i<n;i++){
cout<<setw(5)<<a[i];
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++){
if(v[i]==0){
v[i]=1,a[stp]=i;
dfs(stp+1);
v[i]=0;
}
}
return;
}
可能会有粉丝宝宝问我说setw是什么,这里给大家一个答案setw(5)是指输出五个空格,另外要注意哦,要想引用setw必须先写头文件#include<iomanip>。当然万能更香,毕竟iomanip包含在万能里面吗!
这道题可谓是dfs最简单的一道题,也算是入门题吧。期待你的关注,我们下次在讲一道bfs的题,我们下期再见,拜拜!