πŸ’  Cpp/[Solved.ac] Class2~4

[BOJ][C++] λ°±μ€€ 21736번: ν—Œλ‚΄κΈ°λŠ” μΉœκ΅¬κ°€ ν•„μš”ν•΄ (Silver II)

선달 2024. 11. 12. 05:47
λ°˜μ‘ν˜•

문제

2020년에 μž…ν•™ν•œ ν—Œλ‚΄κΈ° 도연이가 μžˆλ‹€. λ„μ—°μ΄λŠ” λΉ„λŒ€λ©΄ μˆ˜μ—… λ•Œλ¬Έμ— 학ꡐ에 κ°€μ§€ λͺ»ν•΄ 학ꡐ에 μ•„λŠ” μΉœκ΅¬κ°€ μ—†μ—ˆλ‹€. λ“œλ””μ–΄ λŒ€λ©΄ μˆ˜μ—…μ„ ν•˜κ²Œ 된 λ„μ—°μ΄λŠ” μ–΄μ„œ 캠퍼슀 λ‚΄μ˜ μ‚¬λžŒλ“€κ³Ό μΉœν•΄μ§€κ³  μ‹Άλ‹€.
도연이가 λ‹€λ‹ˆλŠ” λŒ€ν•™μ˜ μΊ νΌμŠ€λŠ” $N \times M$ 크기이며 μΊ νΌμŠ€μ—μ„œ μ΄λ™ν•˜λŠ” λ°©λ²•μ€ 벽이 μ•„λ‹Œ μƒν•˜μ’Œμš°λ‘œ μ΄λ™ν•˜λŠ” 것이닀. 예λ₯Ό λ“€μ–΄, 도연이가 ($x$, $y$)에 μžˆλ‹€λ©΄ 이동할 수 μžˆλŠ” 곳은 ($x+1$, $y$), ($x$, $y+1$), ($x-1$, $y$), ($x$, $y-1$)이닀. 단, 캠퍼슀의 λ°–μœΌλ‘œ 이동할 μˆ˜λŠ” μ—†λ‹€.
λΆˆμŒν•œ 도연이λ₯Ό μœ„ν•˜μ—¬ μΊ νΌμŠ€μ—μ„œ 도연이가 λ§Œλ‚  수 μžˆλŠ” μ‚¬λžŒμ˜ 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μž.

μž…λ ₯

첫째 μ€„μ—λŠ” 캠퍼슀의 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ $N$ ($ 1 \leq N \leq 600$), $M$ ($ 1 \leq M \leq 600$)이 주어진닀.
λ‘˜μ§Έ 쀄뢀터 $N$개의 μ€„μ—λŠ” 캠퍼슀의 정보듀이 주어진닀.OλŠ” 빈 곡간,XλŠ” λ²½,IλŠ” 도연이,PλŠ” μ‚¬λžŒμ΄λ‹€.Iκ°€ ν•œ 번만 주어짐이 보μž₯λœλ‹€.

좜λ ₯

첫째 쀄에 도연이가 λ§Œλ‚  수 μžˆλŠ” μ‚¬λžŒμ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€. 단, 아무도 λ§Œλ‚˜μ§€ λͺ»ν•œ 경우TTλ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

λ‹¨μˆœ BFS 문제

근데 문제 λ‚΄μš©μ΄ λ„ˆλ¬΄ μ•„ν”„λ‹€

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

typedef pair<int,int> ci;

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

int main() {
    int n, m;
    cin >> n >> m;

    vector<vector<char>>board(n, vector<char>(m));
    queue<ci> q;
    
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            cin >> board[i][j];
            if(board[i][j] == 'I') {
                q.push({i,j});
            }
        }
    }
    
    int ans = 0;
    while(!q.empty()) {
        ci cur = q.front();
        q.pop();
        
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            if(x<0 || x>=n || y<0 || y>=m) {
                continue;
            }
            
            if(board[x][y] == 'X' || board[x][y] == 'I') {
                continue;
            }
            
            if(board[x][y] == 'P') {
                ans++;
            }
            board[x][y] = 'I';
            q.push({x,y});
        }
    }
    
    if(ans==0) {
        cout << "TT";
    } else {
        cout << ans;
    }

    return 0;
}
λ°˜μ‘ν˜•