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 |