我是靠谱客的博主 殷勤咖啡,最近开发中收集的这篇文章主要介绍DFS(爆搜、深搜),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

DFS俗称爆搜,深搜。DFS对应的流程是一个树的结构,DFS的精髓在于递归求解的思路以及回溯的处理。针对搜索的过程,又有重要的剪枝优化。必要的剪枝优化对DFS的顺序执行有很大的作用。

DFS的过程就是沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都搜过,搜索回溯到发现节点v的那条边的起始节点。

DFS使用的数据结构是栈,时间复杂度是O(n),DFS不具有最短性,也就是DFS搜到的路径不一定是最短路。

详细搜索过程点这!!! 

#include<iostream>
using namespace std;
const int N=10;
int path[N];  //保存序列
bool state[N];//数字是否被用过
int n;
void dfs(int u){
	if(u==n){ //数字全部用完 输出数组
		for(int i=0;i<n;i++) printf("%d ",path[i]);
		printf("n");
		return;
	}
	for(int i=1;i<=n;i++){//空位上可以选择的数字
		if(!state[i]){//数字没有被用过
			path[u]=i;//放入空位中
			state[i]=true;//标记被用过
			dfs(u+1);//填下一个空位
			state[i]=false;//回溯 将数字i取出 并把状态改变
			//path[u]=0;//此句可以不写 因为下次使用时直接把原数据覆盖掉
		}
	}
}
int main(){
	cin>>n;
	dfs(0);  //0代表path数组从0开始存
	return 0;
}

 dfs递归过程

 解析看这!!!

#include<iostream>
using namespace std;
const int N=20;//有对角线 范围乘2
char g[N][N];
bool col[N],dg[N],udg[N];//dg代表对角线 udg代表反对角线
int n;
//已经保证了每行只有一个
void dfs(int u){
	if(u==n){
		for(int i=0;i<n;i++) puts(g[i]);//二维数组可直接输出一行
		puts("");
		return;
	}
	for(int i=0;i<n;i++){
						//i纵坐标 u横坐标  主对角线y=x+b推出b=y-x 为了防止为负 所以加n
						                //反对角线 y=-x+b 推出b=y+x
		if(!col[i]&&!dg[i-u+n]&&!udg[i+u]){
			g[u][i]='Q';
			col[i]=dg[i-u+n]=udg[i+u]=true;
			dfs(u+1);
			col[i]=dg[i-u+n]=udg[i+u]=false;
            g[u][i]='.';
		}
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		g[i][j]='.';//初始值全部赋值位.
	dfs(0);
	return 0;
}
#include<iostream>
using namespace std;
const int N=20;//有对角线 范围乘2
char g[N][N];
bool row[N],col[N],dg[N],udg[N];//dg代表主对角线 udg代表反对角线
int n;
//如果不知道每行都是一个 这个更接近实际
void dfs(int x,int y,int s){ //s表示皇后的个数
	if(y==n) x++,y=0;//该行已经枚举结束
	if(x==n){
		if(s==n){
			for(int i=0;i<n;i++) puts(g[i]);
			puts("");
		}
		return;
	}
	//不放皇后
	dfs(x,y+1,s);
	//放皇后
	if(!row[x]&&!col[y]&&!dg[y-x+n]&&!udg[y+x]){
		row[x]=col[y]=dg[y-x+n]=udg[y+x]=true;
		g[x][y]='Q';
		dfs(x,y+1,s+1);
		g[x][y]='.';
		row[x]=col[y]=dg[y-x+n]=udg[y+x]=false;
	}
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		g[i][j]='.';//初始值全部赋值位.
	dfs(0,0,0);
	return 0;
}

 

最后

以上就是殷勤咖啡为你收集整理的DFS(爆搜、深搜)的全部内容,希望文章能够帮你解决DFS(爆搜、深搜)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部