[백준] 4179번 불!

2025. 1. 12. 17:51·백준 문제/BFS

문제: 4179번: 불!

basic-algo-lecture/workbook/0x09.md at master · encrypted-def/basic-algo-lecture

 

basic-algo-lecture/workbook/0x09.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip> // setprecision을 사용하기 위한 헤더
#include <climits>
#include <list>

using namespace std;


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int r, c; // r: 미로 행의 개수, c: 열의 개수
    cin >> r >> c;

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

    vector<vector<char>> board(r);
    vector<vector<bool>> fvisit(r);
    vector<vector<bool>> jvisit(r);
    vector<vector<int>> dist(r);

    queue<pair<int, int>> jNexts; // 지훈이가 다음에 가는 곳
    queue<pair<int, int>> fNexts; // 불이 다음에 가는 곳
    for (int i = 0; i < r; i++) {
        board[i] = vector<char>(c);
        fvisit[i] = vector<bool>(c);
        jvisit[i] = vector<bool>(c);
        dist[i] = vector<int>(c);

        for (int j = 0; j < c; j++) {
            cin >> board[i][j];

            if (board[i][j] == 'J') {
                dist[i][j] = 1;
                jvisit[i][j] = true;
                jNexts.push(make_pair(i, j));
            }
            else if (board[i][j] == 'F') {
                fvisit[i][j] = true; // 방문 표시
                fNexts.push(make_pair(i, j));
            }
        }
    }

    bool flag = false;
    while (!jNexts.empty()) {
        // 불 먼저 이동시키기
        int fSize = fNexts.size();
        while (fSize-- > 0) {
            pair<int, int> fTmp = fNexts.front();
            fNexts.pop();

            for (int i = 0; i < 4; i++) {
                int fNx = fTmp.first + dx[i];
                int fNy = fTmp.second + dy[i];

                if (fNx < 0 || fNx >= r || fNy < 0 || fNy >= c) continue;
                if (fvisit[fNx][fNy] || board[fNx][fNy] == '#') continue;

                fvisit[fNx][fNy] = true;
                board[fNx][fNy] = 'F';
                fNexts.push(make_pair(fNx, fNy));
            }
        }
        
        // 지훈이 이동시키기
        int jSize = jNexts.size();
        while (jSize-- > 0) {
            pair<int, int> jTmp = jNexts.front();
            jNexts.pop();

            for (int i = 0; i < 4; i++) {
                int jNx = jTmp.first + dx[i];
                int jNy = jTmp.second + dy[i];

                if (jNx < 0 || jNx >= r || jNy < 0 || jNy >= c) {
                    flag = true;
                    cout << dist[jTmp.first][jTmp.second];
                    return 0;
                }

                if (jvisit[jNx][jNy] || board[jNx][jNy] == 'F' || board[jNx][jNy] == '#') continue;

                jvisit[jNx][jNy] = true;
                board[jNx][jNy] = 'J';
                jNexts.push(make_pair(jNx, jNy));
                dist[jNx][jNy] = dist[jTmp.first][jTmp.second] + 1; // 거리 갱신
            }
        }
    }
    if (!flag) 
        cout << "IMPOSSIBLE";
   
    return 0;
}

 

3번 제출하고 나서야 비로소 만점을 받았다... 

 

일단 이 문제의 핵심은 불과 지훈이 각각에 대해 BFS 를 돌려야 한다는 것.. 맵 상에 존재하는 모든 불에대해 다 BFS 돌려주고 그 다음에 지훈이 BFS 돌려주면 된다.

 

내가 2번 째 제출 때 틀린 이유는 지훈이 BFS 돌릴 때 각 단계에서 큐에 존재하던 모든 요소에 대해 돌려야 하는데 단계를 신경쓰지 않고 그냥 하나씩 빼서 돌려가지고 제대로 안 됐던 거였다.. -_-;;

 

이 문제는 솔직히 예외처리도 어려웠다. 반례 정리해놓은 글이 있길래 그걸로 코드 잘못된 거 찾아가면서 겨우겨우 풀었다.

 

 

 

참고자료:

[c++] 백준 불!(4179), BFS, 반례모음

 

[c++] 백준 불!(4179), BFS, 반례모음

문제 https://www.acmicpc.net/problem/4179 J와 F(불)이 미로에 있음. J는 F를 피해 미로를 빠져나와야 한다. 미로 밖으로 나오면 성공 #: 벽 .: 지나갈 수 있는 공간 J: 지훈이의 미로에서의 초기위치 (지나갈

forward-gradually.tistory.com

 

 

'백준 문제/BFS' 카테고리의 다른 글
  • [백준] 1012번 유기농 배추
  • [백준] 1697번 숨바꼭질
  • [백준] 7576번 토마토
  • [백준] 2178번 미로 탐색
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (373) N
      • 논문 읽기 (6)
      • 백준 문제 (220) N
        • 이분탐색 (7)
        • 투포인트 (11) N
        • 그래프 (11)
        • 그리디 (25)
        • DP (26)
        • BFS (23)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (17) N
        • 위상정렬 (8)
        • 자료구조 (26)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (11)
        • 재귀 (8)
        • 수학 (9)
        • 트리 (1)
      • ROS 2 공부 (1)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 학교 수업 정리 (10)
        • 컴퓨터네트워크 정리 (5)
        • 프로그래밍언어론 정리 (5)
      • 진로 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    재귀
    투포인터
    구현
    백준
    티스토리챌린지
    바킹독
    우선순위큐
    해시
    dp
    언리얼
    레트로의 유니티 프로그래밍
    유니티 공부 정리
    BFS
    자료구조
    유니티 프로젝트
    백트래킹
    맵
    그리디
    이분탐색
    C#
    집합
    골드메탈
    그래프
    위상정렬
    수학
    이득우
    정렬
    시뮬레이션
    오블완
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 4179번 불!
상단으로

티스토리툴바