λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

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

[C++/BOJ] 7576 : ν† λ§ˆν†  (bfs/dfs)

728x90

https://www.acmicpc.net/problem/7576

문제

철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό 가지고 μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자 λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© λ„£μ–΄μ„œ 창고에 λ³΄κ΄€ν•œλ‹€. 

창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ˜ μΈμ ‘ν•œ 곳은 μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ λ„€ λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 주지 λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 주어진닀. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 주어진닀. ν•˜λ‚˜μ˜ μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ 주어진닀. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€.

ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

좜λ ₯

μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

 


 

μ΄μ™œ 골5...?

체감상 더 어렀움

 

n(κ°€λ‘œ,μ—΄) ,m(μ„Έλ‘œ, ν–‰) μˆœμ„œμ— μ£Όμ˜ν•΄μ•Ό ν•˜λŠ” 문제...

μ²˜μŒμ— μ΄μ€‘λ°˜λ³΅λ¬Έ λŒλ¦¬λ©΄μ„œ ν† λ§ˆν† κ°€ 1인 μ’Œν‘œλ₯Ό λ°œκ²¬ν•˜λ©΄ κ·Έ μ’Œν‘œμ˜ μƒν•˜μ’Œμš°μ— 1을 λ„£μ–΄μ£Όκ³ ,

visited둜 였늘 읡은 ν† λ§ˆν† μΈμ§€ μ²΄ν¬ν–ˆλŠ”λ°,

κ·Έλƒ₯ λ°”λ‘œ 틀렀버렸닀!

 

맞게 ν’€λ €λ©΄ 처음 μž…λ ₯μ—μ„œ 1인 μ’Œν‘œλ₯Ό λͺ¨λ‘ 큐에 λ„£μ–΄μ€€ λ’€,

μ„ μž…μ„ μΆœ νŠΉμ§•μ„ ν™œμš©ν•˜μ—¬ ν•˜λ‚˜ν•˜λ‚˜ κΊΌλ‚΄μ„œ μƒν•˜μ’Œμš°μ˜ ν† λ§ˆν† λ₯Ό μ΅ν˜€μ£Όλ©΄ λœλ‹€..!!

μ•Œκ³ λ¦¬μ¦˜ μžμ²΄λŠ” 어렡지 μ•Šμ€λ°

μ΄λ ‡κ²Œ 큐λ₯Ό ν™œμš©ν•˜λŠ” 아이디어λ₯Ό λ– μ˜¬λ¦¬κΈ°κ°€ 쉽지 μ•Šλ‹€. γ… γ… 

더 μ—΄μ‹¬νžˆ ν•΄μ•Όκ²ŸμŒ

심지어 내일 넀이버 μ½”ν…Œλ‚ μ΄λΌ κ·ΈλŸ°μ§€ λ°±μ€€ 채점이 ꡉμž₯히 느림 γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹ λ‹€λ“€ μ—΄κ³΅ν•˜μ‹œλŠ”κ°€λ³΄λ‹€,,

 

 

λ‚˜μ˜ 풀이

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

int n;
int m;
int map[1001][1001];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int step[1001][1001];
queue<pair<int, int>> q;

bool canGo(int x, int y){
    if(x<0 || y<0 || x>=m || y>=n) return false;
    if(map[x][y]!=0) return false;
    return true;
}

void bfs(){
    while(!q.empty()){
        pair<int, int> a = q.front();
        q.pop();
        for (int i = 0; i < 4; ++i){
            int nx = a.first + dx[i];
            int ny = a.second + dy[i];
            if(canGo(nx,ny)){
                map[nx][ny] = map[a.first][a.second]+1;
                q.push({nx, ny});
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    bool allTomato = true;
    cin >> n >> m;
    for (int i = 0; i < m; ++i){
        for (int j = 0; j < n; ++j){
            cin >> map[i][j];
            if(map[i][j]==1){
                q.push({i, j});
            }
        }
    }
    bfs();
    int maxday = 0;
    for (int i = 0; i < m; ++i){
        for (int j = 0; j < n; ++j){
            if(map[i][j]==0){
                cout << -1;
                return 0;
            }
            if(maxday < map[i][j]){
                maxday = map[i][j];
            }
        }
    }
    cout << maxday - 1;
}

 

728x90