πŸ“ μ•Œκ³ λ¦¬μ¦˜/Code Tree

[μ½”λ“œνŠΈλ¦¬] BFS 탐색 / 갈 수 μžˆλŠ” κ³³λ“€

xxilliant 2023. 2. 22. 16:36
728x90
λ°˜μ‘ν˜•

갈 수 μžˆλŠ” κ³³λ“€

숫자 0, 1둜만 이루어진 n * n κ²©μžκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, k개의 μ‹œμž‘μ μœΌλ‘œλΆ€ν„° μƒν•˜μ’Œμš° μΈμ ‘ν•œ 곳으둜만 μ΄λ™ν•˜μ—¬ 도달 κ°€λŠ₯ν•œ 칸의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μ„Έμš”. 숫자 0은 ν•΄λ‹Ή 칸이 이동할 수 μžˆλŠ” κ³³μž„μ„, 숫자 1은 ν•΄λ‹Ή 칸이 이동할 수 μ—†λŠ” κ³³μž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

μž…λ ₯ ν˜•μ‹

첫 번째 μ€„μ—λŠ” 격자의 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” nκ³Ό μ‹œμž‘μ μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” k 값이 곡백을 사이에 두고 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

두 번째 쀄 λΆ€ν„°λŠ” n개의 쀄에 걸쳐 각 행에 ν•΄λ‹Ήν•˜λŠ” n개의 μˆ«μžκ°€ μˆœμ„œλŒ€λ‘œ 곡백을 사이에 두고 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

κ·Έ λ‹€μŒ 쀄 λΆ€ν„°λŠ” k개의 쀄에 걸쳐 각 μ‹œμž‘μ μ˜ μœ„μΉ˜ (r, c)κ°€ 곡백을 사이에 두고 μ£Όμ–΄μ§‘λ‹ˆλ‹€. (r, c)λŠ” rν–‰ cμ—΄ μœ„μΉ˜κ°€ μ‹œμž‘μ  쀑 ν•˜λ‚˜μž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€. λͺ¨λ“  μ‹œμž‘μ μ˜ μœ„μΉ˜μ— μ ν˜€μžˆλŠ” μˆ«μžλŠ” 0이고, μ‹œμž‘μ λΌλ¦¬ μ„œλ‘œ κ²ΉμΉ˜μ§€ μ•Šκ²Œ μ£Όμ–΄μ§„λ‹€κ³  가정해도 μ’‹μŠ΅λ‹ˆλ‹€. (1 ≤ r ≤ n, 1 ≤ c ≤ n)

  • 1 ≤ n ≤ 100
  • 1 ≤ k ≤ n * n

좜λ ₯ ν˜•μ‹

μ‹œμž‘μ§€μ μœΌλ‘œλΆ€ν„° 방문이 κ°€λŠ₯ν•œ μ„œλ‘œ λ‹€λ₯Έ 칸의 수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.


λ‚˜μ˜ 풀이

#include <iostream>
#include <queue>
using namespace std;

int n; int k;
int mat[101][101]={0,};
int visited[101][101] = {0,};
int cnt=0;

bool CanGo(int r, int c){
    if(r>n || c>n || r<1 || c<1) return false;
    if(visited[r][c]==1) return false;
    if(mat[r][c]==1) return false;
    return true;
}

int bfs(int r, int c){
    int dx[4] = {1,0,-1,0};
    int dy[4] = {0,1,0,-1};
    queue<pair<int,int> > q;
    q.push(make_pair(r,c));
    if(visited[r][c]==0) cnt++;
    visited[r][c]=1;
    while(!q.empty()){
        pair<int,int> a = q.front(); // μ—¬κΈ°μ„œ 큐의 첫 pairλ₯Ό μ €μž₯해놓고
        q.pop();
            for(int i=0; i<4; ++i){
                int nr = a.first +dx[i]; // 첫 pairμ˜€λ˜ κ°’μ—μ„œ μ΄λ™μ‹œμΌœμ•Όν•¨.!!
                int nc = a.second +dy[i];
                if(CanGo(nr, nc)){
                    q.push(make_pair(nr,nc));
                    visited[nr][nc] = 1;
                    cnt++;
                }
            }
    }

}

int main() {
    cin >> n>>k;
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=n; ++j) cin>>mat[i][j];
    }
    int r; int c;
    for(int i=0; i<k; ++i){
        cin>>r>>c;
        bfs(r, c);
    }
    cout << cnt;
    return 0;
}

 

ν•΄μ„€ μ•ˆλ³΄κ³  ν’€μ–΄λƒˆλ”°

 

728x90
λ°˜μ‘ν˜•