Problem Solving/BOJ(백준)

[BOJ]백준 17836번: 공주님을 구해라!(C++)/BFS

이진2 2021. 6. 17. 01:08

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

 

17836번: 공주님을 구해라!

용사는 마왕이 숨겨놓은 공주님을 구하기 위해 (N, M) 크기의 성 입구 (1,1)으로 들어왔다. 마왕은 용사가 공주를 찾지 못하도록 성의 여러 군데 마법 벽을 세워놓았다. 용사는 현재의 가지고 있는

www.acmicpc.net

응용 BFS문제인 공주님을 구해라 ~!~!

공주에게 도달할 수 있는 최단거리 상태가 검을 얻었을 때/검을 얻지 못했을 때로 나뉘기 때문에 visit 배열을 3차원으로 만들어주어야 한당

이렇게 3차원 visit 배열을 요구하는 BFS문제는 까다로울 수 있기 때문에 주 의 하 자

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

typedef struct { int x, y, k; }point;

int n, m, t, map[101][101], dx[] = { 1,0,-1,0 }, dy[] = { 0,1,0,-1 };
bool visit[2][101][101];

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

	queue<point> q;
	q.push({ 0,0,0 });
	visit[0][0][0] = 1;

	for (int time = 0, size = 0;time<=t; time++) {
		size = q.size();
		while (size--) {
			point cur = q.front(); q.pop();
			if (cur.x == m - 1 && cur.y == n - 1) {
				printf("%d", time);
				return 0;
			}

			for (int i = 0; i < 4; i++) {
				int nx = cur.x + dx[i];
				int ny = cur.y + dy[i];

				if (nx < 0 || nx >= m || ny < 0 || ny >= n)continue;
				if ((cur.k == 1 || map[ny][nx] == 2) && !visit[1][ny][nx]) {
					visit[1][ny][nx] = 1;
					q.push({ nx,ny,1 });
				}
				else {
					if (!visit[0][ny][nx] && map[ny][nx] == 0) {
						visit[0][ny][nx] = 1;
						q.push({ nx,ny,0 });
					}
				}

			}
		}
	}
	printf("Fail");
	return 0;
}