πŸ• Baaaaaarking/0x09κ°• - BFS

[BOJ G5][C++] λ°±μ€€ 7569번: ν† λ§ˆν† 

선달 2022. 3. 10. 21:48
λ°˜μ‘ν˜•

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

 

7569번: ν† λ§ˆν† 

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,Nκ³Ό μŒ“μ•„μ˜¬λ €μ§€λŠ” μƒμžμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Hκ°€ 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

문제

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

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

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

μž…λ ₯

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

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

좜λ ₯

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

 

풀이

[πŸ• Baaaaaarking/0x09κ°• - BFS] - [BOJ G5][C++] λ°±μ€€ 7576번: ν† λ§ˆν† 

 

[BOJ G5][C++] λ°±μ€€ 7576번: ν† λ§ˆν† 

https://www.acmicpc.net/problem/7576 7576번: ν† λ§ˆν†  첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀...

whkakrkr.tistory.com

μœ„ 7576번 ν† λ§ˆν† μ˜ μ—…κ·Έλ ˆμ΄λ“œ 버전

2차원 BFS 문제λ₯Ό 3μ°¨μ›μœΌλ‘œ λ°”κΎΌ ν˜•νƒœλ‹€

근데 ν‹°μ–΄λŠ” κ°™μŒ (G5)

 

삼차원 λ°°μ—΄.. μ†”μ§νžˆ 머리둜 μ΄ν•΄ν•˜λŠ”κ±΄ μ–΄λ ΅μ§€λ§Œ

κ·Έλƒ₯ BFS λ₯Ό 3칸짜리 λ°°μ—΄λ‘œ ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ μ’€ νŽΈν•˜λ‹€

 

λ‹€λ§Œ dz λ₯Ό μΆ”κ°€ν•΄μ„œ μœ„μΈ΅ μ•„λž˜μΈ΅μœΌλ‘œ μ΅λŠ”κ²Œ 번질(?) 수 있게 μ„€μ •ν•΄μ£Όκ³ ,

pair λŒ€μ‹  tuple 을 μ‚¬μš©ν•˜μ—¬ 큐에 μ’Œν‘œ μ„Έκ°œλ₯Ό 넣어쀬닀

 


μ΄μ―€μ—μ„œ μ•Œμ•„λ³΄λŠ”

νŽ˜μ–΄μ™€ νŠœν”Œ - C++ 편

pair μ‚¬μš©λ²•

pair<int, int, int> p = {x, y};

// x = p.first
// y = p.second

tuple μ‚¬μš©λ²•

tuple<int, int, int> t = {x, y, z};

int a, b, c;
tie(a, b, c) = t

// a = x, b = y, c = z

 

μ½”λ“œ

// Authored by : seondal
// 풀이 : https://whkakrkr.tistory.com/
// Co-authored by : -

#include <bits/stdc++.h>
//#include <iostream>
//#include <queue>

using namespace std;

int board[101][101][101];
int dis[101][101][101];

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

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    queue<tuple<int, int, int>> q;
    
    // μž…λ ₯
    int m, n, h;
    cin >> m >> n >> h;
    for(int i=0; i<h; i++){
        for(int j=0; j<n; j++){
            for(int k=0; k<m; k++){
                cin >> board[i][j][k];
                if(board[i][j][k] == 0) dis[i][j][k] = -1;
                if(board[i][j][k] == 1) q.push({i,j,k});
            }
        }
    }
    
    
    // 계산
    while(!q.empty()){
        tuple<int, int, int> current = q.front();
        q.pop();
        int cx, cy, cz;
        tie(cz, cy, cx) = current;
        
        for(int dir=0; dir<6; dir++) {
            int z = cz + dz[dir];
            int y = cy + dy[dir];
            int x = cx + dx[dir];
            if(z<0 || z>=h || y<0 || y>=n || x<0 || x>=m) continue;
            if(dis[z][y][x] >= 0) continue;
            dis[z][y][x] = dis[cz][cy][cx] + 1;
            q.push({z,y,x});
        }
    }
    
    // 좜λ ₯
    int ans=0;
    for(int i=0; i<h; i++){
        for(int j=0; j<n; j++){
            for(int k=0; k<m; k++){
                if(dis[i][j][k] == -1){
                    cout << -1 << "\n";
                    return 0;
                }
                if(dis[i][j][k] > ans) ans = dis[i][j][k];
            }
        }
    }
    cout << ans << "\n";
    return 0;
}

/*
 */

λ‹€λ§Œ μ™œμΈμ§€ #include <iostream> κ³Ό #include <queue> λ₯Ό ν–ˆλ”λ‹ˆ

xcode IDE μ—μ„œλŠ” 잘 λ˜λŠ”λ° BOJμ—μ„œλŠ” μ»΄νŒŒμΌμ—λŸ¬κ°€ 났닀ㅠㅠ

tuple λ•Œλ¬ΈμΈ 것 κ°™κΈ΄ν•œλ° μ™œμΈμ§€λ₯Ό λͺ¨λ₯΄κ² λ‹€...

μš°μ„  κΈ‰ν•œλŒ€λ‘œ #inlcude <bits/stdc++.h> λ₯Ό λ„£μ–΄ ν•΄κ²°

λ°˜μ‘ν˜•