#include <iostream>
#include <queue>
#include <utility>
using namespace std;
int field[1001][1001];
int dist[1001][1001];
int xdir[4] = {1,0,-1,0};
int ydir[4] = {0,1,0,-1};
int m,n;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
string str; cin >> str;
dist[i][j] = -1;
field[i][j] = str[j-1] - '0';
}
}
queue<pair<int,int>> q;
q.push({1,1});
dist[1][1] = 1;
while(!q.empty())
{
pair<int,int> cur = q.front(); q.pop();
int broke = 0;
for(int i = 0;i<4;i++)
{
int curx = cur.first + xdir[i];
int cury = cur.second + ydir[i];
if(curx<1||curx>=n||cury<1||cury>=m) continue;
if(field[curx][cury] == 1 && broke == 0)
{
broke++;
field[curx][cury] = 0;
dist[curx][cury] = dist[cur.first][cur.second] + 1;
q.push({curx,cury});
continue;
}
if(dist[curx][cury] >= 1 || field[curx][cury] == 1) continue;
q.push({curx,cury});
dist[curx][cury] = dist[cur.first][cur.second] + 1;
if(curx == n && curx == m)
{
cout << dist[curx][cury];
return 0;
}
}
}
cout << -1;
}
첫λ²μ§Έ μλμμ μ€λ΅μ΄ λμ€κ³ , λλ²μ§Έ μλμμλ μκ°μ΄κ³Όκ° λμλ€. κ²°κ³Όμ μΌλ‘λ μ€ν¨ γ
첫λ²μ§Έ μλμμλ λ²½μ λΆμλμ§ μλΆμλμ§ μ²΄ν¬νλ μ μλ³μλ₯Ό νλ λ§λ€μ΄μ bfs
μ if
λ¬Έμμ field
κ° 1
μΌλ μ μλ³μλ₯Ό +1
νμ¬ κ΅¬μ±νμμΌλ, μ€ν¨νλ€.
λλ²μ§Έ μλμμλ field
μ 1
μ μμΉλ₯Ό deque
μ μ μ₯νκ³ deque
μμ λ½μ field
λ₯Ό νλμ© 0
μΌλ‘ λ°κΏ bfs
λ₯Ό λ리면μ μ΅μκ°μ μ°Ύκ³ μ νμμΌλ μκ°μ΄κ³Όλ‘ μ€ν¨νλ€.
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
char board[1000][1000];
int dist[1000][1000][2];
// dist[x][y][0] : λ²½μ νλλ λΆμμ§ μκ³ (x,y)κΉμ§ μ€λλ° κ±Έλ¦¬λ λΉμ©
// dist[x][y][1] : λ²½μ νλλ§ λΆμκ³ (x,y)κΉμ§ μ€λλ° κ±Έλ¦¬λ λΉμ©, (x,y)κ° λ²½μ΄λΌμ λΆμλ κ²½μ° ν¬ν¨
int n, m;
bool OOB(int x, int y){
return x < 0 || x >= n || y < 0 || y >= m;
}
int bfs() {
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
dist[i][j][0] = dist[i][j][1] = -1;
dist[0][0][0] = dist[0][0][1] = 1;
queue<tuple<int, int, int>> q;
q.push({0,0,0});
while (!q.empty()) {
int x, y, broken;
tie(x, y, broken) = q.front();
if(x == n-1 && y == m-1) return dist[x][y][broken];
q.pop();
int nextdist = dist[x][y][broken] + 1;
for (int dir = 0; dir < 4; ++dir) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if(OOB(nx, ny)) continue;
if (board[nx][ny] == '0' && dist[nx][ny][broken] == -1) {
dist[nx][ny][broken] = nextdist;
q.push({nx, ny, broken});
}
// (nx, ny)λ₯Ό λΆμλ κ²½μ°
if (!broken && board[nx][ny] == '1' && dist[nx][ny][1] == -1) {
dist[nx][ny][1] = nextdist;
q.push({nx, ny, 1});
}
}
}
return -1;
}
int main(void) {
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];
cout << bfs();
return 0;
}
μ²μμ 보μμλλ μ΄ν΄κ° μλμμΌλ, νλμ© κ³±μΉμ΄λ³΄λ μ§μ§ κΈ°λ°ν μ½λλ€.. γ
γ
(μΈμ μ΄μ λ μ€λ ₯μ΄ λ κΉ)
λ°°μ΄μ 1μΈ΅μ΄ μλ 2μΈ΅μΌλ‘ μ μΈν΄ 1μΈ΅μλ λ²½μ ν΅κ³Όνμ§ μμ κ²½μ°, 2μΈ΅μλ ν΅κ³Όν κ²½μ°μ΄λ€. μ¦, 1μΈ΅μμ μμ§μ΄λ€κ° μ΅μ΄λ‘ λ²½μ λΏμμ
μ 2μΈ΅μΌλ‘ μ¬λΌ
κ°λ κ²μ΄λ€. μ¬λ¬ μ°¨λ‘ μκ°ν΄λ΄λ μ§μ§ κΉλνλ€....