백준 3055 - 탈출
문제
백준 3055 - 탈출 풀러가기
문제 분석
한 칸을 이동 할 때 1만큼의 시간이 걸리고, 최소 시간을 걸리는 문제이므로 가중치가 1인 bfs로 문제를 풀면 된다.
문제 풀이
-
전체 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#include <iostream>#include <queue>#include <cstring>using namespace std;char map[50][50];int time[50][50];int stime[50][50];int dx[] = { 0,0,1,-1 };int dy[] = { 1,-1,0,0 };int r, c;int sr, sc, dr, dc;queue<pair<int, int>> q;int main() {memset(time, -1, sizeof(time));memset(stime, -1, sizeof(stime));cin >> r >> c;for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++) {cin >> map[i][j];if (map[i][j] == '*') {q.push(make_pair(i, j));time[i][j] = 0;}else if (map[i][j] == 'S') {sr = i;sc = j;map[i][j] = '.';}else if (map[i][j] == 'D') {dr = i;dc = j;}}}while (!q.empty()) {int cr = q.front().first;int cc = q.front().second;q.pop();for (int k = 0; k < 4; k++) {int nr = cr + dy[k];int nc = cc + dx[k];if (nr >= 0 && nr < r && nc >= 0 && nc < c) {if (map[nr][nc] == '.' && time[nr][nc] == -1) {time[nr][nc] = time[cr][cc] + 1;q.push(make_pair(nr, nc));}}}}q.push(make_pair(sr, sc));stime[sr][sc] = 0;while (!q.empty()) {int cr = q.front().first;int cc = q.front().second;q.pop();for (int k = 0; k < 4; k++) {int nr = cr + dy[k];int nc = cc + dx[k];if (nr >= 0 && nr < r && nc >= 0 && nc < c) {if (map[nr][nc] == 'X' || stime[nr][nc] != -1) {continue;}if ((stime[cr][cc] + 1 >= time[nr][nc]) && time[nr][nc] != -1) {continue;}q.push(make_pair(nr, nc));stime[nr][nc] = stime[cr][cc] + 1;}}}if (stime[dr][dc] == -1) {cout << "KAKTUS";}else {cout << stime[dr][dc];}return 0;}cs
- 47~64 줄 : 물이 차는 시간을 구하기 위해 bfs를 진행
- 69~95 줄 : 고슴도치가 비버의 굴로 가는 최단 시간을 구함.
- 85 줄 : 만약, 이동하려는 칸의 물이 찬 시간이 현재 칸에서 고슴도치의 시간에서 +1을 한 것 보다 같거나 크다면, 이동 할 수 없다.
추가 테스트 케이스
이곳에서 문제에 주어진 기본적인 테스트 케이스 말고, 다른 테스트 케이스를 이용해 볼 수 있다.
연관 문제
아직 배움의 과정에 있는 학생이니 내용에 부족한 점이 보이면 지적은 하되, 비난은 하지 말아주세요!!
댓글남기기