DFS depth first search
๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ
์์
๋ชจ๋ ์นธ์ด ์คํ์ 1๋ฒ์ฉ ๋ค์ด๊ฐ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ ์นธ์ด N๊ฐ์ผ ๋ O(N)
- ์์ํ๋ ์นธ์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ๋ ํ์๋ฅผ ๋จ๊น
- ์คํ์์ ์์๋ฅผ ๊บผ๋ด์ ๊ทธ ์นธ๊ณผ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ ๋ํด (3)์ ์งํ
- ํด๋น ์นธ์ ์ด์ ์ ๋ฐฉ๋ฌธํ๋ค๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ , ์ฒ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค๋ฉด ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊ธฐ๊ณ ํด๋น ์นธ์ ์คํ์ ์ฝ์
- ์คํ์ด ๋น ๋๊น์ง (2)๋ฅผ ๋ฐ๋ณต
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second // pair์์ first, second๋ฅผ ์ค์ฌ์ ์ฐ๊ธฐ ์ํด์ ์ฌ์ฉ
int board[502][502] = { ... }; // 1์ด ํ๋ ์นธ, 0์ด ๋นจ๊ฐ ์นธ์ ๋์
bool vis[502][502]; // ํด๋น ์นธ์ ๋ฐฉ๋ฌธํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์ฅ
int n = 7, m = 10; // n = ํ์ ์, m = ์ด์ ์
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1}; // ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ์๋ฏธ
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
stack<pair<int,int> > S;
vis[0][0] = 1; // (0, 0)์ ๋ฐฉ๋ฌธํ๋ค๊ณ ๋ช
์
S.push({0,0}); // ์คํ์ ์์์ ์ธ (0, 0)์ ์ฝ์
.
while(!S.empty()){
pair<int,int> cur = S.top(); S.pop();
cout << '(' << cur.X << ", " << cur.Y << ") -> ";
for(int dir = 0; dir < 4; dir++){ // ์ํ์ข์ฐ ์นธ์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir]; // nx, ny์ dir์์ ์ ํ ๋ฐฉํฅ์ ์ธ์ ํ ์นธ์ ์ขํ๊ฐ ๋ค์ด๊ฐ
if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // ๋ฒ์ ๋ฐ์ผ ๊ฒฝ์ฐ ๋์ด๊ฐ
if(vis[nx][ny] || board[nx][ny] != 1) continue; // ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์นธ์ด๊ฑฐ๋ ํ๋ ์นธ์ด ์๋ ๊ฒฝ์ฐ
vis[nx][ny] = 1; // (nx, ny)๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ๋ช
์
S.push({nx,ny});
}
}
}
BFS vs DFS
- bfs : ํ์ฌ ์นธ์์ ์ธ์ ํ ์นธ์ ํ์ฌ ์นธ์์ ๊ฑฐ๋ฆฌ๊ฐ 1๋งํผ ๋จ์ด์ ธ ์๋ค
'โจ Algorithm > ๐โ๐ฆบ ๋ฐํน๋ ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[0x09] BFS (0) | 2023.06.26 |
---|---|
[0x08] ์คํ์ ํ์ฉ(์์์ ๊ดํธ ์) (0) | 2023.06.26 |
[0x07] ๋ฑ (0) | 2023.06.26 |
[0x06] ํ (0) | 2023.06.20 |
[0x05] ์คํ (0) | 2023.06.20 |
๋๊ธ