深度优先搜索

Posted on 2022-03-13 20:20  ZheyuHarry  阅读(73)  评论(0编辑  收藏  举报

这里涉及到的知识是属于搜索问题,我们这里的DFS(Depth-First—Search),即深度优先搜索;

 

这个讨论的是图论的问题,图论的问题是关于边和点的关系

 

 

怎么考虑深度优先搜索呢,就是从起点往相邻的节点去走,边界条件是走到了目标节点后退出,搜索的方式是从一条路走到底,如果还是没有找到目标节点那就回溯往另一条路走,也就是说要把一个图能走的点都去走一遍;

 

 

 

缺点:这样去做深度优先搜索是十分耗时间的一种行为,因为我们是把这一条路走到底,基本上就是说,如果这个情况最差的话我们得吧这个图的所有节点都给遍历一遍,对于大的数据来讲的话是很不恰当的,时间;

 

 

 

优点:对于内存的消耗不高,解决了BFS过量消耗内存的行为;

 

843. n-皇后问题 - AcWing题库

 

核心代码:

 

 

#include<bits/stdc++.h>

 

using namespace std;
int n;
char arr[10][10];

 

int judge(int i,int j){
for(int k = 1;k<i;k++){
if(arr[k][j] == 'Q') return 1;
} //检查列
int m = i-1 , e = j-1;
while(m>=1 && e>=1){
if(arr[m--][e--] == 'Q') return 1;
}
m = i-1 , e = j+1;
while(m>=1 && e<=n){
if(arr[m--][e++] == 'Q') return 1;
}
return 0;
}

 

void dfs(int k){
if(k == n){
for(int i = 1;i<=n;i++){
for(int j = 1; j<=n;j++){
if(arr[i][j] != 'Q') cout<<'.';
else cout<<'Q';
}
cout<<'\n';
}
cout<<'\n'; //边界条件
}
for(int i = 1; i<=n;i++){
if(judge(k+1,i)) continue;
arr[k+1][i] = 'Q';
dfs(k+1);
arr[k+1][i] = '.';
}
return ;
}

 

int main()
{
cin>>n;
dfs(0);
return 0;
}