搜索是对一个事物的查询。他可以给出两点最短路,还能求方案数等等。
好的,正文开始:
深度优先搜索
深度优先搜索(dfs)顾名思义就是从深度的角度出发进行搜索。具体来讲,就是完成一个步骤后将它的每一个子步骤都试一遍,注意是先搜完子步骤(一般认为子步骤层次更深)再试试当前层次的其他步骤。就比如说,有这样一个游戏:首先,你手里有一个字母a,你可以在它的后面添一个字母b或c。如果你选择添加b,那么你又可以再在它的后面添一个d或e;如果你选择添加c,那你又可以再在它的后面添一个f或g。这个小游戏的图和深度优先搜索的路径如下图所示(假设先搜左边):
编程模版:
好的,我们终于到编程环节了。别怕,真的很简单。
首先,定义一个dfs函数。
void dfs(int t) { //数据类型、函数名、参数按需填写
}
接着,确定求出答案后的输出。
void dfs(int t) { //数据类型、函数名、参数按需填写
if(/*成功条件*/) {
//输出
return;
}
}
最后,依次枚举每个子步骤并定义vis数组表示访问过。
bool vis[N]; //N按需填写
void dfs(int t) { //数据类型、函数名、参数按需填写
if(/*成功条件*/) {
//输出
return;
}
for(/*枚举每个子步骤编号*/) {
if(vis[/*当前枚举的子步骤编号*/]) continue;
vis[/*同上*/]=1;
dfs(t+1);//t+1只是个例,一般表示下一层次,真正代码要按需填写
vis[/*同上*/]=0;//清空,以免下一个方案搜索时混淆
}
}
实战练习:
先声明一下,不要先抄(看)答案,这对你的能力没有太大帮助。
这些都是我自创的,比较简单,适合新手练习。
1.输出n的全排列(全排列不知道的人点击左边的“全排列”)
注意了注意了,不是计算答案,而是把方案输出。
数据要求:n<=1000
(免得看到答案而设的缓冲区)
代码:
#include <iostream>
using namespace std;
bool vis[1005]; //已经访问过的数字
int ans[1005]; //用于保存答案
void dfs(int t,int n) { //这里表示答案保存了t位,全排列是有n位的
if(t>n) {
for(int i=1; i<=n; i++) {
cout<<ans[i];
}
cout.put('\n'); //'\n'快一点。但是这仅为个人习惯,请用自己喜欢的换行方法。
/*cout.put是putchar的c++版本*/
}
for(int i=1; i<=n; i++) {
if(vis[i]) continue;
vis[i]=1;
ans[t]=i; //保存答案
dfs(t+1,n); //搜索下一个层次
ans[t]=0;
vis[i]=0;
}
}
int main() {
int n;
cin>>n;
dfs(1,n);
return 0;
}
运行效果:
2.图的连通性问题
请阅读背景,否则你将做不出来。
题目背景:
小明在一个景区中的一个景点x,他想知道他能不能到达景点y。路都是单行道。
题目要求:
首先输入x和y。
输入两个数n和m,表示在该景区有n个景点、m条连接景点的路。(景点有编号1~n)
接下来m行,输入两个数u和v,表示景点编号u和景点v相连。
输出yes或no。
0<n,m<=10000。
提示:
可以参看我的文章《图论基础之认识、存图和遍历》。
代码:
#include <iostream>
#include <vector>
using namespace std;
bool vis[10005];
vector<int>mp[10005];
bool dfs(int x,int y,int n) {
vis[x]=1;
if(x==y) {
return true;
}
for(auto v:mp[x]) {
if(vis[v]) continue;
if(dfs(v,y,n)) return true;
}
return false;
}
int main() {
int x,y;
cin>>x>>y;
int n,m;
cin>>n>>m;
for(int i=1; i<=m; i++) {
int u,v;
cin>>u>>v;
mp[u].push_back(v);
}
if(dfs(x,y,n)) {
cout<<"yes";
} else {
cout<<"no";
}
return 0;
}
具体你们结合两篇文章分析吧。
标签:优先,return,int,步骤,dfs,vis,算法,c++,景点 From: https://blog.csdn.net/weixin_72829799/article/details/140244966