https://www.acmicpc.net/problem/2206
๋ฌธ์
N×M์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค.
๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ํ ๊ฐ์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ ํ ๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค.
ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค.
๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
ํ์ด
์ผ๋ฐ bfs ๋ฌธ์ ์๋ ๋ฌ๋ฆฌ ๋ฒฝ์ ๋ถ์๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค..
๊ณ ๋ฏผ์ ์ข ๋ง์ด ํ๋๋ฐ ๊ทธ๋ฅ ๊ฑฐ๋ฆฌ ํ์ํ๋ ์ด์ค๋ฐฐ์ด์ ๋๊ฐ๋ก ๋ง๋ค์๋ค (๊ฒฐ๊ตญ์ ์ผ์ค๋ฐฐ์ด..)
๋ฒฝ์ ํ๋ฒ์ด๋ผ๋ ๋ถ์ ํ ์งํํ๋ฉด dis[x][y][1] ์ ๊ธฐ๋ก๋๊ณ
๋ฒฝ์ ํ๋ฒ๋ ๋ถ์์ง ์์๋ค๋ฉด dis[x][y][0] ์ ์งํ์ํฉ์ด ๊ธฐ๋ก๋๋ค
์ผ์ค๋ฐฐ์ด์ด๋ผ pair ๊ฐ ์๋ tuple ์ ์ฌ์ฉํด์ผํ๊ณ
bfs ๋ฅผ ๋๋ฆฌ๋ฉฐ ์ด๋ํ ๋๋ ๋ฒฝ์ ๋ถ์๋ ๊ฒฝ์ฐ์ ์๋๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ์ด๋ํ ์ ์๊ฒ ํ๋ค
์ด๋ ์กฐ๊ฑด์ ์ ๊ฒฝ์จ์ ๊ฑธ์ด์คฌ๋ค (์ฝ๋ ์ฐธ๊ณ )
์ฃผ์ํด์ผํ ์์๋
1. ์ธํ์ ๋์ด์ฐ๊ธฐ๊ฐ ์๊ธฐ๋๋ฌธ์ board ๋ฅผ char ๋ก ๋ฐ์์ผํ๋ค
2. ๋ฒฝ ๋ถ์จ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํด๋๊ณ ์ถ๋ ฅํ ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ถ๋ ฅํด์ผํ๋ค
3. ์ง๋๊ฐ ์นธ์ ๊ฐฏ์๋ฅผ ์ถ๋ ฅํด์ผ ํ๊ธฐ๋๋ฌธ์ ์ด๊ธฐ (0,0) ๊ฐ์ 1๋ก ๋ฌ์ผํ๋ค
์ด ์ ๋?
// Authored by : seondal
// ํ์ด : https://whkakrkr.tistory.com/
// Co-authored by : -
//#include <bits/stdc++.h>
#include <iostream>
#include <queue>
using namespace std;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
int n,m;
char board[1002][1002];
int dis[1002][1002][2];
queue<tuple<int,int,int>> q;
bool broken = false;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
// ์
๋ ฅ
cin >> n >> m;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> board[i][j];
dis[i][j][0] = -1;
dis[i][j][1] = -1;
}
}
q.push({0,0,0});
dis[0][0][0] = 1;
dis[0][0][1] = 1;
// ์ด ๋ฌธ์ ๋ ์ง๋๊ฐ ์นธ์ ๊ฐฏ์๋ฅผ ์นด์ดํธํด์ผํ๋ฏ๋ก ์ด๊น๊ฐ์ด 1์ธ๊ฒ์ ์ฃผ์
// ๊ณ์ฐ
while(!q.empty()){
int cx,cy,cb;
tie(cx,cy,cb) = q.front();
q.pop();
for(int dir=0; dir<4; dir++) {
int x = cx + dx[dir];
int y = cy + dy[dir];
if(x<0 || x>=n || y<0 || y>=m) continue;
// ๋ถ์์ง ์๋ ๊ฒฝ์ฐ -> ๊ฐ๊ณณ์ด ๋ฒฝ์ด ์๋๊ณ , ๋ฐฉ๋ฌธํ์ง ์์๊ฒฝ์ฐ
if(board[x][y]=='0' && dis[x][y][cb]==-1) {
dis[x][y][cb] = dis[cx][cy][cb] + 1;
q.push({x,y,cb});
}
// ๋ถ์๋ ๊ฒฝ์ฐ -> ์์ง ์๋ถ์
จ๊ณ , ๊ฐ๊ณณ์ด ๋ฒฝ์ด๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ
if(cb==0 && board[x][y]=='1' && dis[x][y][1]==-1) {
dis[x][y][1] = dis[cx][cy][cb] + 1;
q.push({x,y,1});
broken = true;
}
}
}
if(broken)
cout << dis[n-1][m-1][1];
else
cout << dis[n-1][m-1][0];
return 0;
}
/*
*/
'๐ Baaaaaarking > 0x09๊ฐ - BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ G5][C++] ๋ฐฑ์ค 13549๋ฒ : ์จ๋ฐ๊ผญ์ง 3 (๋ฐํ์์๋ฌ์์์ ์) (0) | 2022.04.16 |
---|---|
[BOJ G4][C++] ๋ฐฑ์ค 2573๋ฒ: ๋น์ฐ (0) | 2022.04.15 |
[BOJ S1][C++] 2468๋ฒ: ์์ ์์ญ (76%) (0) | 2022.04.07 |
[BOJ S1][C++] ๋ฐฑ์ค 2667๋ฒ : ๋จ์ง๋ฒํธ ๋ถ์ด๊ธฐ (6%) (0) | 2022.03.24 |
[BOJ S1][C++] ๋ฐฑ์ค 2583๋ฒ : ์์ญ ๊ตฌํ๊ธฐ (0) | 2022.03.21 |