공주님을구해라!
1.설계(7)
-
문제 해석
- N x M 배열에서 (1,1)좌표에서 시작하여 공주님위치(N,M)에 T시간 내에 도착하는 가장 빠른 시간을 구하는 문제입니다.
- 배열에서 그람(검)을 찾은 경우에는 마법벽을 뚫고 이동할 수 있습니다.
-
설계
- 검을 찾지 않은 상태와 찾은 상태를 표현하기 위해 visited[N][M][2] 배열을 이용합니다.
- 최소시간을 구하기 위해서 BFS를 이용하고 T시간동안 진행하게 됩니다.
2.구현(X)
- 코드
#include <iostream>
#include <queue>
using namespace std;
#define MAXN 100
int N, M,T;
struct info {
int x;
int y;
int found;
};
queue<info> q;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int map[MAXN][MAXN];
bool visited[MAXN][MAXN][2];
void bfs() {
q.push({ 0,0,0 });
visited[0][0][0] = true;
int cnt = 0;
for (int t = 0; t<=T; t++){
int q_size = q.size();
while (q_size--) {
int x = q.front().x;
int y = q.front().y;
int found = q.front().found;
if (map[x][y] == 2) {
found = 1;
}
if (x == N - 1 && y == M - 1) {
cout << t << "\n";
return;
}
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (visited[nx][ny][found]) continue;
if (map[nx][ny] == 2 || (map[nx][ny] == 1 && found == 1) || map[nx][ny] == 0) {
visited[nx][ny][found] = true;
q.push({ nx,ny,found });
}
}
}
}
cout << "Fail\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M >> T;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
bfs();
return 0;
}
-
디버깅
- 그람(검)을 찾은 경우 바로 found=1로 변환시켜 visited[x][y][0]이 check가 되지 않은 점을 꾸준함님의 풀이 를 통해 알게 되었습니다.
-
제출결과
0ms
3.마무리
- 단순한 BFS문제였지만 아주 사소한 차이로 인해 풀이가 완벽하지 못했습니다.