도 론 - DFS
24891 단어 알고리즘
, 。 , , 。 , , , coding , 。 。
DFS: 깊이 우선 검색 은 가능 한 한 깊 은 곳 으로 진행 합 니 다. 나무의 앞 뒤 를 옮 겨 다 니 는 것 은 특정한 의미 에서 깊이 우선 검색 BFS 라 고 할 수 있 습 니 다. 넓 은 범위 에서 검색 하고 넓 은 범위 에서 출발 합 니 다. (물 과 유사) 수의 층 차 는 사실은 BFS 와 유사 합 니 다.
여 기 는 나무 로 유추 한다.
데이터 구조 상: DFS 는 스 택 stack 을 사용 하고 BFS 는 대기 열 을 사용 합 니 다. 공간 복잡 도 에서 볼 때 DFS 의 시간 복잡 도 O (n), BFS 의 시간 복잡 도 는 O (2n 2 ^ n 2n) 입 니 다.
대비: BFS 는 가장 짧 은 길 이라는 개념 이 존재 합 니 다. 층 별로 찾 는 것 이기 때 문 입 니 다.DFS 는 깊이 에서 출발 하기 때문에 최 단 로 의 성질 을 가지 고 있 지 않다.
DFS 와 BFS 는 역 추적 과 가지치기 에 관련 될 수 있 습 니 다.
예제 도입:
#include
#include
using namespace std;
//DFS ,+ ,
const int N=10;
//
int path[N];//
int n;
bool st[N];// , true 。
// st[N] false
void dfs(int u){
if(u==n)//
{
for(int i=0;i<n;i++){
cout<<path[i]<<" ";
}
puts("");//
return;
}
// ,
for(int i=0;i<n;i++){
//!st[i] :
if(!st[i]){
path[u]=i;
st[i]=true;// i
dfs(u+1);//
st[i]=false;// 、
}
}
}
#include
using namespace std;
int main(){
cin>>n;
dfs(0);// 0 ,
return 0;
}
DFS 의 또 다른 응용 프로그램: N 황후 의 문 제 를 복습 하 는 김 에 재 귀 합 니 다.도입 예제: Acwing - 843. n - 황후 문제 leetcode - 51. N 황 후 는 사실 이 두 문제 가 똑 같 습 니 다. 여 기 는 세 가지 방법 을 통 해 앞의 두 가지 방법 으로 심도 있 는 우선 검색 을 사용 합 니 다. 바로 약간 격식 적 으로 바 뀌 었 습 니 다.
#include
using namespace std;
const int N=20;
int n;
bool col[N],N_dg[N],P_dg[N];
char oc[N][N];
//
void dfs(int u){
if(u==n){
for(int i=0;i<n;i++){
puts(oc[i]);
}
puts("");
return;
}
for(int i=0;i<n;i++){
// +
if(!col[i]&&!N_dg[u+i]&&!P_dg[n-u+i]){
oc[u][i]='Q';
col[i]=N_dg[u+i]=P_dg[n-u+i]=true;
dfs(u+1);
col[i]=N_dg[u+i]=P_dg[n-u+i]=false;
oc[u][i]='.';
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
oc[i][j]='.';
}
}
// dfs
dfs(0);
return 0;
}
leetcode 의 문제 풀이:
어떻게 행렬 에서 깊 은 수색 을 진행 합 니까?일반적인 사고방식 은 마치 우리 가 다음 기 에 하 는 것 과 같다.
#include
using namespace std;
const int N=20;
bool col[N],row[N],N_dg[N],P_dg[N];
char oc[N][N];
int n;//n ,
//s
void dfs(int x,int y,int s){
//
if(y==n) y=0,x++;
if(x==n){
if(s==n){
for(int i=0;i<n;i++){
puts(oc[i]);
}
puts("");
}
return;
}
// ,
// , ,
dfs(x,y+1,s);
// . : , ,
if(!row[x]&&!col[y]&&!N_dg[x+y]&&!P_dg[x-y+n]){
oc[x][y]='Q';
// , ,
row[x]=col[y]=N_dg[x+y]=P_dg[x-y+n]=true;
//
dfs(x,y+1,s+1);
row[x]=col[y]=N_dg[x+y]=P_dg[x-y+n]=false;
oc[x][y]='.';
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
oc[i][j]='.';// .
}
}
// ,
// ,
dfs(0,0,0);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.