반응형

https://www.acmicpc.net/problem/14923

 

14923번: 미로 탈출

홍익이는 사악한 마법사의 꾐에 속아 N x M 미로 (Hx, Hy) 위치에 떨어졌다. 다행히도 홍익이는 마법사가 만든 미로의 탈출 위치(Ex, Ey)를 알고 있다. 하지만 미로에는 곳곳에 마법사가 설치한 벽이

www.acmicpc.net

 

BFS를 이용하여 풀었습니다.

다음으로 이동할 위치가 빈 칸이라면, 그냥 이동하면 됩니다.

다음으로 이동할 위치가 벽이라면, 아직 지팡이를 사용하지 않았을 때는 지팡이를 사용해서 이동할 수 있습니다.

지팡이를 이미 사용했다면 이동할 수 없습니다.

큐에 지팡이 사용 여부를 같이 기억해주고, 지팡이를 사용했을 때와 사용하지 않았을 때의 방문 처리를 별도로 해주었습니다.

 

#include <iostream>
#include <queue>
using namespace std;

int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };

int n, m, hx, hy, ex, ey;
int map[1000][1000];
bool visit[1000][1000][2] = { false };

int main() {
	scanf("%d %d %d %d %d %d", &n, &m, &hx, &hy, &ex, &ey);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			scanf("%d", &map[i][j]);

	queue<vector<int>> q;
	q.push({ hx - 1, hy - 1, 0, 0 });
	visit[hx - 1][hy - 1][0] = true;
	while (!q.empty()) {
		int x = q.front()[0];
		int y = q.front()[1];
		int t = q.front()[2];
		int c = q.front()[3];
		q.pop();
		if (x == ex - 1 && y == ey - 1) {
			printf("%d", c);
			return 0;
		}
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
			if (map[nx][ny] == 1) {
				if (visit[nx][ny][1] || t != 0) continue;
				q.push({ nx, ny, 1, c + 1 });
				visit[nx][ny][1] = true;
			}
			else {
				if (visit[nx][ny][t]) continue;
				q.push({ nx, ny, t, c + 1 });
				visit[nx][ny][t] = true;
			}
		}
	}
	printf("-1");
}
반응형

'Algorithm' 카테고리의 다른 글

백준 1937 : 욕심쟁이 판다  (0) 2021.11.15
백준 10216 : Count Circle Groups  (0) 2021.11.15
백준 1238 : 파티  (0) 2021.11.15
백준 14676 : 영우는 사기꾼?  (0) 2021.11.15
백준 18870 : 좌표 압축  (0) 2021.11.15

+ Recent posts