728x90
https://www.acmicpc.net/problem/17836
17836번: 공주님을 구해라!
용사는 마왕이 숨겨놓은 공주님을 구하기 위해 (N, M) 크기의 성 입구 (1,1)으로 들어왔다. 마왕은 용사가 공주를 찾지 못하도록 성의 여러 군데 마법 벽을 세워놓았다. 용사는 현재의 가지고 있는
www.acmicpc.net
최단거리를 찾는 BFS 문제이다.
2차원 배열에서 방문하지 않은 점을 방문하면서 탐색하면 되고, 탐색도중 그람이 있으면 그 위치부터 맨해튼 거리값을 더해서 최소 값이 되는지 확인하면 된다.
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int map[100][100] = { 0 };
int N, M, T;
int d[8] = { -1,0,0,1,1,0,0,-1 };
int bfs(pair<int,int>start, pair<int,int> end, pair<int,int> gram) {
int visit[100][100] = { 0 };
int i, j, r, c, dr,dc, nr,nc, dist, ret, tmp;
queue<pair<int, pair<int,int>>> q;
q.push(make_pair(0, start));
ret = 100000;
visit[start.first][start.second] = 0; // 1더했으니 뒤에서 1빼야됨
while (!q.empty()) {
dist = q.front().first;
r = q.front().second.first;
c = q.front().second.second;
q.pop();
if (dist > ret) break;
if (end.first == r && end.second == c) {
ret = min(dist, ret);
break;
}
if (gram.first == r && gram.second == c) {
tmp = dist + abs(gram.first - N + 1) + abs(gram.second - M + 1);
ret = min(tmp, ret);
}
for (i = 0; i < 4; i++)
{
dr = r + d[2 * i];
dc = c + d[2 * i + 1];
if (dr < 0 || dr >= N || dc < 0 || dc >= M) continue;
if (map[dr][dc] == 1) continue;
if (visit[dr][dc]) continue;
visit[dr][dc] = dist + 1;
q.push(make_pair(dist + 1, make_pair(dr, dc)));
}
}
if (ret > T)
return -1;
return ret;
}
int main() {
// 0 init
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int i, j, ans;
pair<int, int> gram;
// 1 input
cin >> N >> M >> T;
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
cin >> map[i][j];
if (map[i][j] == 2)
gram = make_pair(i, j);
}
}
ans = bfs(make_pair(0, 0), make_pair(N-1,M-1), gram);
if (ans == -1) {
cout << "Fail";
}
else {
cout << ans;
}
cout << "\n";
return 0;
}
'STUDY > Algorithm' 카테고리의 다른 글
[백준] 24230 트리 색칠하기 python (0) | 2022.01.26 |
---|---|
[백준] 17073 나무 위의 빗물 python (0) | 2022.01.26 |
[백준] 17829 222-풀링, python, C++ (0) | 2022.01.25 |
[백준] 1013 Contact, python (0) | 2022.01.24 |
[백준] 10546 배부른 마라토너 python (0) | 2022.01.23 |