-
[17836] 공주님을 구해라!BOJ 2021. 11. 9. 11:41
https://www.acmicpc.net/problem/17836
17836번: 공주님을 구해라!
용사는 마왕이 숨겨놓은 공주님을 구하기 위해 (N, M) 크기의 성 입구 (1,1)으로 들어왔다. 마왕은 용사가 공주를 찾지 못하도록 성의 여러 군데 마법 벽을 세워놓았다. 용사는 현재의 가지고 있는
www.acmicpc.net
<문제>
visited를 3차원으로 만든뒤 (0, 0)에서 (n-1, m-1)까지 4방향 bfs를 돌리는 문제
단순히 검에 도착하면 memset후 큐 초기화를 진행하면
도착지와 검까지의 거리가 같을때, 검을 먼저 탐색하는 경우가 반례가 되어
검을 구하기 전과 후의 visited를 분리하고 초기화는 진행하지 않아야한다.
<소스코드>
1234567891011121314151617181920212223242526272829303132333435363738394041#include <bits/stdc++.h>using namespace std;bool visited[101][101][2];int n, m, t, a[101][101], dy[4] = {0, 1, 0, -1}, dx[4] = {1, 0, -1, 0};typedef struct {int y, x, turn;bool key;} state;queue<state> q;int main(void) {cin >> n >> m >> t;int i, j;for (i = 0; i < n; i++)for (j = 0; j < m; j++) cin >> a[i][j];q.push({0, 0, 0, 0});while (!q.empty()) {state cur = q.front();q.pop();if (cur.turn > t) continue;if (cur.y == n - 1 && cur.x == m - 1) {cout << cur.turn;return 0;}for (i = 0; i < 4; i++) {int y = cur.y + dy[i];int x = cur.x + dx[i];if (y < 0 || x < 0 || y >= n || x >= m) continue;if (visited[y][x][cur.key]) continue;visited[y][x][cur.key] = 1;if (a[y][x] == 0) {q.push({y, x, cur.turn + 1, cur.key});} else if (a[y][x] == 1 && cur.key == 1) {q.push({y, x, cur.turn + 1, cur.key});} else if (a[y][x] == 2) {q.push({y, x, cur.turn + 1, 1});}}}cout << "Fail";return 0;}cs 'BOJ' 카테고리의 다른 글
[14940] 쉬운 최단거리 (0) 2021.11.09 [15971] 두 로봇 (0) 2021.11.09 [2194] 유닛 이동시키기 (0) 2021.11.08 [4781] 사탕 가게 (0) 2021.11.07 [18405] 경쟁적 전염 (0) 2021.11.06