DFS (다차원 배열)
DFS(Depth First Search)
- 다차원 배열에서 각 칸을 방문할 때 깊이를 우선으로 방문하는 알고리즘
DFS 알고리즘
- BFS 알고리즘에서 큐를 스택으로만 바꾸면 DFS 알고리즘이 된다.
다른건 다 똑같음!!
-
시작하는 칸을 "스택"에 넣고 방문했다는 표시를 남김
-
"스택"에서 원소를 꺼내어 그 칸과 상하좌우로 인접한 칸에 대해 3번을 진행
-
해당 칸을 이전에 방문했다면 아무것도 하지않고, 처음으로 방문했다면 방문했다는 표시를 남기고 해당 칸을 스택에 삽입
-
"스택"이 빌 때까지 2번을 반복
- 시간복잡도 : 모든 칸이 스택에 1번씩 들어가므로 칸이 N개일 때 O(N)
BFS vs DFS
-
비록 최종적인 방문 결과는 똑같아도, 방문 순서에서 차이가 있다.
-
거리를 계산할 때는 DFS를 사용할 수 없음. BFS로만 거리계산 가능
- BFS 의 특징인 "현재 보는 칸으로부터 추가되는 인접한 칸은 거리가 현재 보는 칸보다 1만큼 더 떨어져있다" 는 성질이 DFS에서는 성립 X
DFS 구현 예시
- 이전에 다루었던 BFS 구현에서, 큐를 스택으로만 바꾼 것 외에는 전부 다 코드가 완전히 일치한다.
#include <bits/stdc++.h>
using namespace std;
int board[502][502] = {...};
bool vis[502][502];
int n= 7, m = 10;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int main(void)
{
stack<pair<int,int>> s;
vis[0][0] = 1;
s.push({0,0});
while(!s.empty()){
pair<int,int> cur = s.top();
s.pop();
cout << '(' << cur.first << ', ' << cur.second << ") ->";
for(int i=0; i<4; i++){
int x = cur.first + dx[i];
int y = cur.second + dy[i];
if(x < 0 || x >= n || y < 0 || y >= m)
continue;
if(vis[x][y] || board[x][y] != 1)
continue;
vis[x][y] = 1;
s.push({x,y});
}
}
}
Author And Source
이 문제에 관하여(DFS (다차원 배열)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@msung99/DFS저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)