-
[2665] 미로만들기BOJ 2022. 3. 22. 23:09
https://www.acmicpc.net/problem/2665
2665번: 미로만들기
첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.
www.acmicpc.net
맵이 작으므로 종료상태일때 바로 return하지 않도록 구현해도 된다.
마냥 방문만 할수 없으므로, [행][열][벽을 지난 회수]로 방문처리해주었다.
위 방법은 입력이 충분히 작기에 가능하다. 실제로는 0-1 bfs태그가 달려야할거 같은 문제였다.
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;constexpr int dy[4] = {0, 1, 0, -1}, dx[4] = {1, 0, -1, 0};int n;char a[555][555];bool vst[55][55][3000];typedef struct {int y, x, cnt;} state;int f(int sy, int sx) {queue<state> q;q.push({sy, sx, 0});vst[sy][sx][0] = true;int ans = 54321;while (!q.empty()) {auto cur = q.front();q.pop();if (cur.y == n - 1 && cur.x == n - 1) ans = min(cur.cnt, ans);for (int 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 >= n) continue;int nxt = cur.cnt + (a[y][x] == '0');if (vst[y][x][nxt] == false) {vst[y][x][nxt] = true;q.push({y, x, nxt});}}}return ans;}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);cin >> n;int i, j;for (i = 0; i < n; i++)for (j = 0; j < n; j++) cin >> a[i][j];cout << f(0, 0);return 0;}
'BOJ' 카테고리의 다른 글
[1949] 우수 마을 (0) 2022.03.22 [18265] MooBuzz (0) 2022.03.22 [10282] 해킹 (0) 2022.03.22 [2447] 별 찍기 - 10 (0) 2022.03.18 [14425] 문자열 집합 (0) 2022.03.15