[c++] BOJ 2146 :: ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ

๋‚œ์ด๋„ : ๊ณจ๋“œ 3

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 30๋ถ„

 

๋ฌธ์ œ

๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

2146๋ฒˆ: ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ

์—ฌ๋Ÿฌ ์„ฌ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋‚˜๋ผ๊ฐ€ ์žˆ๋‹ค. ์ด ๋‚˜๋ผ์˜ ๋Œ€ํ†ต๋ น์€ ์„ฌ์„ ์ž‡๋Š” ๋‹ค๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ๊ณต์•ฝ์œผ๋กœ ์ธ๊ธฐ๋ชฐ์ด๋ฅผ ํ•ด ๋‹น์„ ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ๋Œ€ํ†ต๋ น์— ์ทจ์ž„ํ•˜์ž, ๋‹ค๋ฆฌ๋ฅผ ๋†“๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์•„๊น๋‹ค

www.acmicpc.net

 

ํ’€์ด

  • ๊ฐ€์žฅ ์งง์€ ๋‹ค๋ฆฌ์˜ ๊ธธ์ด == ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ์  ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
  • ๋ชจ๋“  ์„ฌ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•จ
  • ๊ฐ ์„ฌ์— ์†ํ•œ ์ ๋“ค๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์„ฌ์˜ ์ ๋“ค๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
    • ๊ฐ€์ค‘์น˜ ์—†์œผ๋ฏ€๋กœ bfs ์ด์šฉ
    • ๊ฐ ์„ฌ์— ์†ํ•˜๋Š” ์ ๋“ค์€ bfs๋กœ ๋”ฐ๋กœ ์ฐพ๊ธฐ

 

์ฝ”๋“œ

#include <iostream>
#include <queue>

using namespace std;

int map[101][101];
int direction[4][2] = { {1,0}, {0,-1}, {-1, 0}, {0,1} };
vector<vector<pair<int, int>>> colorLand;

int bfs(int land, pair<int, int> start) {
    // land์˜ start ์ ์—์„œ ๋‹ค๋ฅธ land๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ (x์ขŒํ‘œ ์ฐจ์ด + y์ขŒํ‘œ ์ฐจ์ด)
    int dist = 1e9;
    for (int i = land + 1; i < colorLand.size(); i++) {
        // land idx ์ด์ƒ์˜ land์—์„œ๋งŒ ์ง„ํ–‰ํ•˜๋ฉด ๋จ
        for (int j = 0; j < colorLand[i].size(); j++) {
            pair<int, int> pos = colorLand[i][j];
            int distTmp = abs(start.first - pos.first) + abs(start.second - pos.second)-1;
            if (distTmp < dist)
                dist = distTmp;
        }
    }
    return dist;
}

int main() {
    // ์ž…๋ ฅ
    int N; cin >> N;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> map[i][j];
        }
    }

    // ๊ฐ™์€ ์„ฌ์— ์†ํ•˜๋Š” ์œก์ง€ ์ฐพ๊ธฐ
    queue<pair<int, int>> que;
    int colorIdx = -1;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (map[i][j] != 1)
                continue;
            que.push(make_pair(i, j)); // ์œก์ง€ ์ƒ‰ ์น ํ•˜๊ธฐ
            map[i][j] = 0;

            vector<pair<int, int>> tmp; // ์ดˆ๊ธฐํ™”
            colorLand.push_back(tmp);
            colorIdx++;

            while (!que.empty()) {
                pair<int, int> pos = que.front(); que.pop();
                colorLand[colorIdx].push_back(pos);
                int r = pos.first; int c = pos.second;
                for (int k = 0; k < 4; k++) {
                    int rp = r + direction[k][0];
                    int cp = c + direction[k][1];
                    if (rp < 0 || cp < 0 || rp >= N || cp >= N) // ๋งต ๋ฐ–์— ์œ„์น˜
                        continue;
                    if (map[rp][cp] != 1) // ์œก์ง€๊ฐ€ ์•„๋‹ˆ๋ฉด
                        continue;
                    que.push(make_pair(rp, cp));
                    map[rp][cp] = 0; // 0์œผ๋กœ ์—†์• ๋ฒ„๋ฆฌ๊ธฐ
                }
            }
        }
    }

    int minResult = 1e9;
    // ์„ฌ์˜ ๊ฐ ์ ๋งˆ๋‹ค bfs ๋Œ๋ฆฌ๊ธฐ
    for (int i = 0; i < colorLand.size(); i++) { // ๊ฐ ์„ฌ๋งˆ๋‹ค
        for (int j = 0; j < colorLand[i].size(); j++) { // ๊ฐ ์ ๋งˆ๋‹ค
            int res = bfs(i, colorLand[i][j]);
            if (res < minResult)
                minResult = res;
        }
    }

    cout << minResult;
}

 

๊ฒฐ๊ณผ

๋ฌธ์ œ ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2472 48 C++17 / ์ˆ˜์ • 2376

 

๋ฐ˜์‘ํ˜•