- toc {:toc}
ํ์ด
outer side์์ inner side๋ก ์ด๋ํ๋ ์ํฉ์ ๊ฐ์ ํ๊ธฐ ์ํด์ 1ํ์ ์ ๊ธฐ๊ฐ ํตํ๋ ๋ถ๋ถ๋ง ํ์ ์ง์ด ๋ฃ๋๋ค. BFS๋ฅผ ์ด์ฉํด์ ํ์ํ๊ณ ํ์ํ๋ ๋์ ๋ง์ง๋ง ํ์ ๋๋ฌํ๋ฉด inner side๋ก ๋๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ํ์ ๋๋ฌํ ๊ฒฝ์ฐ YES๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ค.
while ๋ฌธ์ด ๋๋๋ ๋์์๋ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ๋ ๋ง์ง๋ง ํ์ ๋๋ฌํ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ NO๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ค.
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define X first
#define Y second
int board[1003][1003];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
queue <pair<int, int>> q;
int main(){
ios::sync_with_stdio(0); cin.tie(0);
int M, N;
cin >> M >> N;
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
char ch;
cin >> ch;
if(ch == '0') board[i][j] = 0;
else board[i][j] = 1;
if(i == 0 && board[i][j] == 0){
board[i][j] = -1;
q.push({i, j});
}
}
}
while(!q.empty()){
auto cur = q.front(); q.pop();
for(auto dir = 0; dir < 4; dir++){
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= M || ny < 0 || ny >= N) continue;
if(board[nx][ny] == -1 || board[nx][ny] == 1) continue;
if(nx == M-1){
cout << "YES" << endl;
return 0;
}
q.push({nx, ny});
board[nx][ny] = -1;
}
}
cout << "NO" << endl;
return 0;
}