๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS

[BOJ G4][C++] ๋ฐฑ์ค€ 1600๋ฒˆ : ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด (๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ๋„ˆ๋ฌด์‹ซ์–ด)

์„ ๋‹ฌ 2022. 4. 17. 15:59
๋ฐ˜์‘ํ˜•

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

 

1600๋ฒˆ: ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— ๊ฒฉ์žํŒ์˜ ๊ฐ€๋กœ๊ธธ์ด W, ์„ธ๋กœ๊ธธ์ด H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ H์ค„์— ๊ฑธ์ณ W๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, 0์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ํ‰์ง€, 1์€ ์žฅ์• ๋ฌผ์„ ๋œปํ•œ๋‹ค. ์žฅ์• ๋ฌผ์ด ์žˆ

www.acmicpc.net

 

๋ฌธ์ œ

๋™๋ฌผ์›์—์„œ ๋ง‰ ํƒˆ์ถœํ•œ ์›์ˆญ์ด ํ•œ ๋งˆ๋ฆฌ๊ฐ€ ์„ธ์ƒ๊ตฌ๊ฒฝ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ๋…€์„์€ ๋ง(Horse)์ด ๋˜๊ธฐ๋ฅผ ๊ฐ„์ ˆํžˆ ์›ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋Š” ๋ง์˜ ์›€์ง์ž„์„ ์œ ์‹ฌํžˆ ์‚ดํŽด๋ณด๊ณ  ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋ง์€ ๋ง์ด๋‹ค. ๋ง์€ ๊ฒฉ์žํŒ์—์„œ ์ฒด์Šค์˜ ๋‚˜์ดํŠธ์™€ ๊ฐ™์€ ์ด๋™๋ฐฉ์‹์„ ๊ฐ€์ง„๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ์— ๋ง์˜ ์ด๋™๋ฐฉ๋ฒ•์ด ๋‚˜ํƒ€๋‚˜์žˆ๋‹ค. xํ‘œ์‹œํ•œ ๊ณณ์œผ๋กœ ๋ง์ด ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ฐธ๊ณ ๋กœ ๋ง์€ ์žฅ์• ๋ฌผ์„ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์žˆ๋‹ค.

  x   x  
x       x
    ๋ง    
x       x
  x   x  

๊ทผ๋ฐ ์›์ˆญ์ด๋Š” ํ•œ ๊ฐ€์ง€ ์ฐฉ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ๋ง์€ ์ €๋ ‡๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์›์ˆญ์ด๋Š” ๋Šฅ๋ ฅ์ด ๋ถ€์กฑํ•ด์„œ ์ด K๋ฒˆ๋งŒ ์œ„์™€ ๊ฐ™์ด ์›€์ง์ผ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ์™ธ์—๋Š” ๊ทธ๋ƒฅ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์€ ์ธ์ ‘ํ•œ ์นธ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด์ œ ์›์ˆญ์ด๋Š” ๋จธ๋‚˜๋จผ ์—ฌํ–‰๊ธธ์„ ๋– ๋‚œ๋‹ค. ๊ฒฉ์žํŒ์˜ ๋งจ ์™ผ์ชฝ ์œ„์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋งจ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€ ๊ฐ€์•ผํ•œ๋‹ค. ์ธ์ ‘ํ•œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ๋ฒˆ ์›€์ง์ด๋Š” ๊ฒƒ, ๋ง์˜ ์›€์ง์ž„์œผ๋กœ ํ•œ ๋ฒˆ ์›€์ง์ด๋Š” ๊ฒƒ, ๋ชจ๋‘ ํ•œ ๋ฒˆ์˜ ๋™์ž‘์œผ๋กœ ์นœ๋‹ค. ๊ฒฉ์žํŒ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์›์ˆญ์ด๊ฐ€ ์ตœ์†Œํ•œ์˜ ๋™์ž‘์œผ๋กœ ์‹œ์ž‘์ง€์ ์—์„œ ๋„์ฐฉ์ง€์ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— ๊ฒฉ์žํŒ์˜ ๊ฐ€๋กœ๊ธธ์ด W, ์„ธ๋กœ๊ธธ์ด H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ H์ค„์— ๊ฑธ์ณ W๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, 0์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ํ‰์ง€, 1์€ ์žฅ์• ๋ฌผ์„ ๋œปํ•œ๋‹ค. ์žฅ์• ๋ฌผ์ด ์žˆ๋Š” ๊ณณ์œผ๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์€ ํ•ญ์ƒ ํ‰์ง€์ด๋‹ค. W์™€ H๋Š” 1์ด์ƒ 200์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๊ณ , K๋Š” 0์ด์ƒ 30์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์›์ˆญ์ด์˜ ๋™์ž‘์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์‹œ์ž‘์ ์—์„œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

[๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS] - [BOJ S2][C++] ๋ฐฑ์ค€ 7562๋ฒˆ: ๋‚˜์ดํŠธ์˜ ์ด๋™

[๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS] - [BOJ G4][C++] ๋ฐฑ์ค€ 2206๋ฒˆ : ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

 

์œ„ ๋‘๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์งฌ๋ฝ•์‹œํ‚จ ๋“ฏํ•œ ๋ฌธ์ œ์˜€๋‹ค

๋ง์˜ ์ด๋™ ๋ฐฉํ–ฅ์„ ์ž˜ ์„ค์ •ํ•ด์ฃผ๊ณ 

๋ฐฉ๋ฌธ๋ฐฐ์—ด์€ 3์ฐจ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ง์ฒ˜๋Ÿผ ์ด๋™ํ•œ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•ด์ฃผ๋Š”

 

// Authored by : seondal
// ํ’€์ด : https://whkakrkr.tistory.com/
// Co-authored by : -

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

using namespace std;

int mdx[4] = {0,0,-1,1};
int mdy[4] = {1,-1,0,0};
int hdx[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int hdy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

int k,w,h;
int board[202][202];

int dis[202][202][32];
queue<tuple<int,int,int>> q;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> k >> w >> h;
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++) {
            cin >> board[i][j];
            
            for(int t=0; t<=k; t++)
                dis[i][j][t] = -1;
        }
    }
    
    q.push({0,0,0});
    dis[0][0][0] = 0;
    
    while(!q.empty()){
        int cx, cy, horse;
        tie(cx,cy,horse) = q.front();
        q.pop();
        
        // ๋ง์ฒ˜๋Ÿผ ์›€์ง์ด๊ธฐ
        if(horse < k){
            for(int dir=0; dir<8; dir++){
                int x = cx + hdx[dir];
                int y = cy + hdy[dir];
                
                if(x<0 || x>=h || y<0 || y>=w) continue;
                if(board[x][y]==1 || dis[x][y][horse+1]>=0) continue;
                
                dis[x][y][horse+1] = dis[cx][cy][horse] + 1;
                q.push({x,y,horse+1});
            }
        }
        
        // ์›์ˆญ์ด์ฒ˜๋Ÿผ ์›€์ง์ด๊ธฐ
        for(int dir=0; dir<4; dir++){
            int x = cx + mdx[dir];
            int y = cy + mdy[dir];
            
            if(x<0 || x>=h || y<0 || y>=w) continue;
            if(board[x][y]==1 || dis[x][y][horse]>=0) continue;
            
            dis[x][y][horse] = dis[cx][cy][horse] + 1;
            q.push({x,y,horse});
        }
    }
    
    int ans = 40000;
    for(int i=0; i<=k; i++) {
        if(dis[h-1][w-1][i] == -1) continue;
        ans = min(ans, dis[h-1][w-1][i]);
    }
    if(ans == 40000) cout << -1;
    else cout << ans;
    
    return 0;
}

/*
 */

 


์‹œํ–‰์ฐฉ์˜ค 1

๊ทธ๋ƒฅ.. ์ฒ˜์Œ์— ํ’€์–ด์„œ ํ‹€๋ฆฐ๊ฑฐ..

๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ 2์ฐจ์›๋ฐฐ์—ด๋กœ ํ–ˆ๋”๋‹ˆใ… ใ… 

// Authored by : seondal
// ํ’€์ด : https://whkakrkr.tistory.com/
// Co-authored by : -

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

using namespace std;

int mdx[4] = {0,0,-1,1};
int mdy[4] = {1,-1,0,0};
int hdx[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int hdy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

int k,w,h;
int board[202][202];

pair<int,int> dis[202][202]; // {๋ง์ฒ˜๋Ÿผ ์›€์ง์ธ ํšŸ์ˆ˜, ์ด ์›€์ง์ž„ ํšŸ์ˆ˜}
queue<pair<int,int>> q;
int horse = 0; // ๋ง์ฒ˜๋Ÿผ ์›€์ง์ธ ํšŸ์ˆ˜

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> k >> w >> h;
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++) {
            cin >> board[i][j];
            dis[i][j] = {0,-1};
        }
    }
    
    q.push({0,0});
    dis[0][0] = {0,0};
    
    while(!q.empty()){
        auto c = q.front();
        q.pop();
        
        // ๋ง์ฒ˜๋Ÿผ ์›€์ง์ด๊ธฐ
        if(dis[c.first][c.second].first < k){
            for(int dir=0; dir<8; dir++){
                int x = c.first + hdx[dir];
                int y = c.second + hdy[dir];
                
                if(x<0 || x>=h || y<0 || y>=w) continue;
                if(board[x][y]==1 || dis[x][y].second>=0) continue;
                
                q.push({x,y});
                dis[x][y] = {dis[c.first][c.second].first+1, dis[c.first][c.second].second+1};
            }
        }
        
        for(int dir=0; dir<4; dir++){
            int x = c.first + mdx[dir];
            int y = c.second + mdy[dir];
            
            if(x<0 || x>=h || y<0 || y>=w) continue;
            if(board[x][y]==1 || dis[x][y].second>=0) continue;
            
            q.push({x,y});
            dis[x][y] = {dis[c.first][c.second].first, dis[c.first][c.second].second+1};
        }
    }
    
    cout << dis[h-1][w-1].second;
    
    return 0;
}

/*
 */

 

์ฐพ์•„๋ณด๋‹ˆ ๋‹ค์Œ ๋ฐ˜๋ก€๊ฐ€ ์•ˆ๋๋‹ค

์ž…๋ ฅ 1 4 4 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0

์ •๋‹ต : 4
์ถœ๋ ฅ : -1

https://www.acmicpc.net/board/view/50114

 

๊ธ€ ์ฝ๊ธฐ - ์–ด๋–ค ๋ถ€๋ถ„์ด ํ‹€๋ฆฐ๊ฑด์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์š” ใ… ใ… 

๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

www.acmicpc.net

 

๋‚˜๋ž‘ ๋˜‘๊ฐ™์ด ํ‘ธ์‹  ๋ถ„์ด ๊ณ„์…จ๋‹ค

๊ทธ๋ฆฌ๊ณ  ์นœ์ ˆํ•œ ๋ฐ˜๋ก€์™€ ๋‹ต๋ณ€๊ณผ ์„ค๋ช…

.. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ํ•˜ใ… ใ… ใ… 

 

์‹œํ–‰์ฐฉ์˜ค 2

์ž˜ ๋˜๋Š”์ค„ ์•Œ์•˜๋Š”๋ฐ...

์•ˆ๋๋‹ค...

๋‚œ์ƒ ์ฒ˜์Œ ๋ณด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ์˜ ํ–ฅ์—ฐ...

์ผ๋‹จ ์ด์œ ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ

์›์ธ์€ ์ด๊ฑฐ์˜€๋‹ค

// ๋ง์ฒ˜๋Ÿผ ์›€์ง์ด๊ธฐ
        if(horse < k){
            for(int dir=0; dir<8; dir++){
                int x = cx + hdx[dir];
                int y = cy + hdy[dir];
                
                if(x<0 || x>=h || y<0 || y>=w) continue;
                // if(board[x][y]==1 || dis[x][y][horse]>=0) continue;
                if(board[x][y]==1 || dis[x][y][horse+1]>=0) continue;
                
                dis[x][y][horse+1] = dis[cx][cy][horse] + 1;
                q.push({x,y,horse+1});
            }
        }

 

์ฃผ์„์ฒ˜๋ฆฌํ•œ ๋ถ€๋ถ„์„ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ”๊ฟ”์คฌ๋”๋‹ˆ

๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋‹ค ๋˜‘๊ฐ™์€๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ์•ˆ๋‚ฌ๋‹ค

 

https://www.acmicpc.net/board/view/39705

 

๊ธ€ ์ฝ๊ธฐ - ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ๋œจ๋Š”๋ฐ ์ง€์  ๋ถ€ํƒ๋“œ๋ ค์šฉ

๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

www.acmicpc.net

 

๋‹ค ํ’€๊ณ  ์ฐพ์•„๋ณด๋‹ˆ ๋‚˜๋ž‘ ๋น„์Šทํ•œ ์‚ฌ๋žŒ์ด ๋˜ ์žˆ์—ˆ๋‹ค ํใ… ใ… 

๋ฐ˜์‘ํ˜•