์ƒˆ์†Œ์‹

์•Œ๊ณ ๋ฆฌ์ฆ˜/BaekJoon

[C++] BOJ 6087๋ฒˆ: ๋ ˆ์ด์ € ํ†ต์‹ 

  • -
728x90

๋ฌธ์ œ

๊ฑฐ์šธ์„ ์„ค์น˜ํ•˜๋ฉด ๋ฐฉํ–ฅ์„ 90๋„ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

*์€ ๋ฒฝ์œผ๋กœ ๋šซ๊ณ  ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค.

๊ฑฐ์šธ์„ ์ตœ์†Œ๋กœ ์„ค์น˜ํ•˜์—ฌ์„œ ์ฒ˜์Œ ์‹œ์ž‘์ง€์  C์—์„œ ๋์ง€์  C์— ๋„๋‹ฌํ• ๋•Œ๊นŒ์ง€ ๊ฐ€์•ผํ•œ๋‹ค.

์ตœ์†Œ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์šธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ผ

 

์ž…๋ ฅ 1

7 8
.......
......C
......*
*****.*
....*..
....*..
.C..*..
.......

์ถœ๋ ฅ 1

3

์ฝ”๋“œ

#include<iostream>
#include<algorithm>
#include<utility>
#include<queue>
#include<vector>

using namespace std;

//6087๋ฒˆ ๋ ˆ์ด์ € ํ†ต์‹ 

char MAP[101][101];
int visited[101][101];
int w, h;
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };

pair<int, int> startP, endP;
queue<pair<int,int>> cntDir;
queue < pair<int, int>> Q;
void BFS() {
    for (int i = 0; i < 4; i++) {
        Q.push(make_pair(startP.first, startP.second));
        cntDir.push(make_pair(0, i));
    }
    visited[startP.first][startP.second] = 0;

    while (Q.empty() == 0) {
        int y = Q.front().first;
        int x = Q.front().second;
        int cnt = cntDir.front().first;
        int dir = cntDir.front().second;
        Q.pop();
        cntDir.pop();
        //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
        for (int i = 0; i < 4; i++) {
            int ny = y + arrow[i][0];
            int nx = x + arrow[i][1];
            int nCnt = cnt;

            if (nx <0 || nx >= w || ny < 0 || ny >=h) continue;
            if (MAP[ny][nx] == '*') continue;
            if (dir != i) nCnt++;
            if (visited[ny][nx] >= nCnt) {
                visited[ny][nx] = nCnt;
                Q.push(make_pair(ny, nx));
                cntDir.push(make_pair(nCnt, i));
            }
        }
    }
    cout << visited[endP.first][endP.second];
}

void input() {
    bool isFirst = true;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            cin >> MAP[i][j];
            if (MAP[i][j] == 'C') {
                (isFirst) ? startP = make_pair(i, j) : endP = make_pair(i, j);
                isFirst = false;
            }
            visited[i][j] = 10001;
        }
    }
}

int main() {

    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> w >> h;
    
    input();
    BFS();


    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

void input() {
    bool isFirst = true;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            cin >> MAP[i][j];
            if (MAP[i][j] == 'C') {
                (isFirst) ? startP = make_pair(i, j) : endP = make_pair(i, j);
                isFirst = false;
            }
            visited[i][j] = 10001;
        }
    }
}

๋จผ์ € input ํ•จ์ˆ˜์—์„œ cin์„ ํ†ตํ•ด MAP์„ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

๊ทธ ์ค‘ ๋งŒ์•ฝ C๊ฐ€ ์ž…๋ ฅ๋˜์—ˆ๋‹ค๋ฉด ์ฒ˜์Œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ์ฒ˜์Œ์ด๋ผ๋ฉด startP์— ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋„ฃ๊ณ , ์ฒ˜์Œ์ด ์•„๋‹ˆ๋ผ๋ฉด endP์— ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋„ฃ๋Š”๋‹ค.

void BFS() {
    for (int i = 0; i < 4; i++) {
        Q.push(make_pair(startP.first, startP.second));
        cntDir.push(make_pair(0, i));
    }
    visited[startP.first][startP.second] = 0;

    while (Q.empty() == 0) {
        int y = Q.front().first;
        int x = Q.front().second;
        int cnt = cntDir.front().first;
        int dir = cntDir.front().second;
        Q.pop();
        cntDir.pop();
        //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
        for (int i = 0; i < 4; i++) {
            int ny = y + arrow[i][0];
            int nx = x + arrow[i][1];
            int nCnt = cnt;

            if (nx <0 || nx >= w || ny < 0 || ny >=h) continue;
            if (MAP[ny][nx] == '*') continue;
            if (dir != i) nCnt++;
            if (visited[ny][nx] >= nCnt) {
                visited[ny][nx] = nCnt;
                Q.push(make_pair(ny, nx));
                cntDir.push(make_pair(nCnt, i));
            }
        }
    }
    cout << visited[endP.first][endP.second];
}

ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์œ„์น˜์ธ startP์˜ ์œ„์น˜๋ฅผ 4๋ฒˆ Q์— ์˜ฎ๊ฒจ๋‹ด์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์œ„์น˜์—์„œ ์œ„,์•„๋ž˜,์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉํ–ฅ์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค. ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๊ฑฐ์šธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋”ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

๊ทธ ๋‹ค์Œ Q๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ while๋ฌธ์„ ๋Œ๋ฆฝ๋‹ˆ๋‹ค. Q์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ  ์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํƒ์ƒ‰์—์„œ *์ธ ๋ฒฝ์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ ๋งต์„ ๋ฒ—์–ด๋‚˜๋ฉด ํƒ์ƒ‰์„ ๊ฑด๋„ˆ๋›ฐ๊ณ , ๋งŒ์•ฝ ๊ฐ€๋˜ ๋ฐฉํ–ฅ๊ณผ ํ˜„์žฌ ๋ฐฉํ–ฅ์ด ๋งž์ง€ ์•Š๋‹ค๋ฉด ๊ฑฐ์šธ์„ ๋”ํ•ด์ค๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜์—์„œ์˜ ๊ฑฐ์šธ์„ ์‚ฌ์šฉํ•œ ๊ฐฏ์ˆ˜๋ฅผ visited[][] ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ธฐ์— ๋งŒ์•ฝ ์‚ฌ์šฉํ•œ ๊ฐฏ์ˆ˜๊ฐ€ ํ˜„์žฌ ์นด์šดํŠธ๋ณด๋‹ค ๋†’๋‹ค๋ฉด ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋์ง€์ ์— ๋„๋‹ฌํ• ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•˜์—ฌ์„œ visited[๋์ง€์ .y][๋์ง€์ .x] ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.