Skip to content

Latest commit

Β 

History

History
108 lines (89 loc) Β· 3.61 KB

Q4179.md

File metadata and controls

108 lines (89 loc) Β· 3.61 KB

Q4179

문제

μ§€ν›ˆμ΄λŠ” λ―Έλ‘œμ—μ„œ 일을 ν•œλ‹€. μ§€ν›ˆμ΄λ₯Ό λ―Έλ‘œμ—μ„œ νƒˆμΆœν•˜λ„λ‘ λ„μ™€μ£Όμž!

λ―Έλ‘œμ—μ„œμ˜ μ§€ν›ˆμ΄μ˜ μœ„μΉ˜μ™€ 뢈이 뢙은 μœ„μΉ˜λ₯Ό κ°μ•ˆν•΄μ„œ μ§€ν›ˆμ΄κ°€ λΆˆμ— 타기전에 νƒˆμΆœν•  수 μžˆλŠ”μ§€μ˜ μ—¬λΆ€, 그리고 μ–Όλ§ˆλ‚˜ 빨리 νƒˆμΆœν•  수 μžˆλŠ”μ§€λ₯Ό κ²°μ •ν•΄μ•Όν•œλ‹€.

μ§€ν›ˆμ΄μ™€ λΆˆμ€ λ§€ λΆ„λ§ˆλ‹€ ν•œμΉΈμ”© μˆ˜ν‰λ˜λŠ” 수직으둜(λΉ„μŠ€λ“¬ν•˜κ²Œ μ΄λ™ν•˜μ§€ μ•ŠλŠ”λ‹€)Β  μ΄λ™ν•œλ‹€.

λΆˆμ€ 각 μ§€μ μ—μ„œ λ„€ λ°©ν–₯으둜 ν™•μ‚°λœλ‹€.

μ§€ν›ˆμ΄λŠ” 미둜의 κ°€μž₯μžλ¦¬μ— μ ‘ν•œ κ³΅κ°„μ—μ„œ νƒˆμΆœν•  수 μžˆλ‹€.

μ§€ν›ˆμ΄μ™€ λΆˆμ€ 벽이 μžˆλŠ” 곡간은 ν†΅κ³Όν•˜μ§€ λͺ»ν•œλ‹€.

μž…λ ₯

μž…λ ₯의 첫째 μ€„μ—λŠ” 곡백으둜 κ΅¬λΆ„λœ 두 μ •μˆ˜ Rκ³Ό Cκ°€ μ£Όμ–΄μ§„λ‹€. 단, 1 ≀ R, C ≀ 1000 이닀. R은 미둜 ν–‰μ˜ 개수, CλŠ” μ—΄μ˜ κ°œμˆ˜μ΄λ‹€.

λ‹€μŒ μž…λ ₯으둜 Rμ€„λ™μ•ˆ 각각의 미둜 행이 μ£Όμ–΄μ§„λ‹€.

각각의 λ¬Έμžλ“€μ€ λ‹€μŒμ„ λœ»ν•œλ‹€.

  • # : λ²½
  • . : μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 곡간
  • J : μ§€ν›ˆμ΄μ˜ λ―Έλ‘œμ—μ„œμ˜ μ΄ˆκΈ°μœ„μΉ˜ (μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 곡간)
  • F : 뢈이 λ‚œ 곡간

JλŠ” μž…λ ₯μ—μ„œ ν•˜λ‚˜λ§Œ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

μ§€ν›ˆμ΄κ°€ 뢈이 λ„λ‹¬ν•˜κΈ° 전에 미둜λ₯Ό νƒˆμΆœ ν•  수 μ—†λŠ” 경우 IMPOSSIBLE 을 좜λ ₯ν•œλ‹€.

μ§€ν›ˆμ΄κ°€ 미둜λ₯Ό νƒˆμΆœν•  수 μžˆλŠ” κ²½μš°μ—λŠ” κ°€μž₯ λΉ λ₯Έ νƒˆμΆœμ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int r, c;
    cin >> r >> c;
    string str[1002];
    int dx[4] = {0, 0, -1, 1};
    int dy[4] = {1, -1, 0, 0};
    queue<pair<int, int>> exodus;
    queue<pair<int, int>> fire;
    int fDist[1002][1002];
    int jDist[1002][1002];
    for(int i=0;i<r;i++) {
        fill(fDist[i], fDist[i]+c, -1);
        fill(jDist[i], jDist[i]+c, -1);
    }
    for(int i=0;i<r;i++) cin >> str[i];

    for(int i=0;i<r;i++) {
        for(int j=0;j<c;j++){
            if(str[i][j] == 'J') {
                exodus.push({i, j});
                jDist[i][j] = 0;
            }
            if(str[i][j] == 'F') { 
                fire.push({i, j});
                fDist[i][j] = 0;
            }
        }
    }

    while(!fire.empty()) {
        pair<int, int> curF = fire.front();
        fire.pop();
        for(int i=0;i<4;i++) {
            int fx = curF.first + dx[i];
            int fy = curF.second + dy[i];
            // 뢈 움직이기
            // 1) 뢈이 κ°€μ§€ λͺ»ν•˜λŠ” κ³³
            if(fx < 0 || fx >= r || fy < 0 || fy >=c) continue;
            // λ²½μ΄κ±°λ‚˜ 이미 κ°”λ˜ κ³³
            if(str[fx][fy] == '#' || fDist[fx][fy] >=0) continue;
            fDist[fx][fy] = fDist[curF.first][curF.second] + 1;
            fire.push({fx, fy});
        }
    }
    while(!exodus.empty()) {
        pair<int, int> curJ = exodus.front();
        exodus.pop(); 
        for(int i=0;i<4;i++) {
            int jx = curJ.first + dx[i];
            int jy = curJ.second + dy[i];
            if(jx < 0 || jx >= r || jy < 0 || jy >=c) {
                cout << jDist[curJ.first][curJ.second] + 1;
                return 0;
            }
            // μ§€ν›ˆμ΄ 움직이기
            // 1) μ§€ν›ˆμ΄κ°€ κ°€μ§€ λͺ»ν•˜λŠ” κ³³
            if(str[jx][jy] == '#' || jDist[jx][jy] >= 0) continue;
            // 이미 fireκ°€ λ‹€λ…€κ°„ κ³³μ΄κ±°λ‚˜, λ„μ°©ν•œ μ‹œμ μ— 뢈이 λ™μ‹œμ— λ„μ°©ν•˜κ±°λ‚˜, ν˜Ήμ€ μžμ‹ λ³΄λ‹€ 뢈이 더 빨리 λ„μ°©ν•˜λŠ” μžλ¦¬μ— 갈 수 μ—†μŒ.
            if(fDist[jx][jy]!=-1 && fDist[jx][jy] <= jDist[curJ.first][curJ.second]+1) continue;
            jDist[jx][jy] = jDist[curJ.first][curJ.second] + 1;
            exodus.push({jx, jy});
        }
    }
    cout << "IMPOSSIBLE";
    return 0;
}