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

Algorithm/BOJ

[BOJ] μ†Œλ¬Έλ‚œ 칠곡주(1941)

[λ°±μ€€(BOJ)] 1941_μ†Œλ¬Έλ‚œ 칠곡주 C++

문제 : BOJ_1941번 μ†Œλ¬Έλ‚œ 칠곡주

문제 μ„€λͺ…

5 * 5의 map이 주어지고, 각 μžλ¦¬λŠ” 'Y' ν˜Ήμ€ 'S'둜 ν‘œν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μœ„, μ•„λž˜, 쒌, μš°μ— μ„œλ‘œ μΈμ ‘ν•œ 7개의 μžλ¦¬μ—μ„œ 'S' κ°€ μ΅œμ†Œ 4개 이상 μžˆλŠ” 7 자리의 수λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.


Solution

μ™„μ „ 탐색, bfs

각 μžλ¦¬μ— λŒ€ν•œ 정보λ₯Ό 벑터에 μ €μž₯ν•΄ μ€λ‹ˆλ‹€.

μ €μž₯ν•  μ •λ³΄λŠ” 각 자리의 μœ„μΉ˜, 'S'μΈμ§€μ˜ μ—¬λΆ€μž…λ‹ˆλ‹€.

μ €μž₯된 μƒνƒœμ—μ„œ 7개의 자리λ₯Ό check ν•΄μ£Όκ³  이 7개의 μžλ¦¬μ—μ„œ 'S'κ°€ 4개 이상인 경우 bfsλ₯Ό λŒλ €μ€λ‹ˆλ‹€.

bfsμ—μ„œ λ‹€μŒμ„ ν™•μΈν•˜λ©° μˆœνšŒν•΄ μ€λ‹ˆλ‹€.

  • 주어진 크기 μ•ˆμ— μžˆλŠ” map의 μžλ¦¬μΈμ§€
  • 쒌, 우, 상, ν•˜λ‘œ μΈμ ‘λΌμžˆλŠ”μ§€
  • μ•žμ„  μ™„μ „ νƒμƒ‰μ—μ„œ check λ˜μ–΄ μžˆλŠ” μžλ¦¬μΈμ§€

    이 쑰건을 λ§Œμ‘±ν•˜λ©° check된 7개의 자리λ₯Ό λͺ¨λ‘ μˆœνšŒν•œ κ²½μš°μ— 닡에 μΆ”κ°€ν•΄ μ€λ‹ˆλ‹€.

Description

  • 25C7 = 480,700이고 bfs둜 7개λ₯Ό push ν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„κ°€ 크지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • check ν•˜λŠ” 각 μš”μ†ŒλŠ” lotμ΄λΌλŠ” pair 배열을 μ„ μ–Έν•˜μ—¬ μœ„μΉ˜ μ’Œν‘œλ₯Ό μ €μž₯ν–ˆμŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
char map[6][6];
int s_chk[26];
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
int cnt_m = 1;
void go(int idx, int cnt);
int chk[26];
int res,swc;
void go_res();
int lot[26][26];
vector<pair<int, int>> v;
int main(void) {
    v.resize(26);
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= 5; j++) {
            scanf(" %c", &map[i][j]);
            if (map[i][j] == 'S') s_chk[cnt_m] = 1;
            lot[i][j] = cnt_m;
            v[cnt_m] = { i,j };
            cnt_m++;
        }
    }
    go(1, 1);
    printf("%d\n", res);
}
void go(int idx, int cnt) {
    if (cnt == 8) {
        int das = 0;
        swc = 0;
        for (int i = 1; i <= 25; i++) {
            if (chk[i]) {
                if (s_chk[i]) {
                    das++;
                    if (!swc) swc = i;
                }
            }
        }
        if (das >= 4) go_res();
        return;
    }
    for (int i = idx; i <= 25; i++) {
        if (chk[i]) continue;
        chk[i] = 1;
        go(i, cnt + 1);
        chk[i] = 0;
    }
}
void go_res(void) {
    int go = 0;
    int vis[26][26];
    memset(vis, 0, sizeof(vis));
    queue<pair<int,int>> q;
    q.push({ v[swc].first, v[swc].second });
    vis[v[swc].first][v[swc].second] = 1;
    while (!q.empty()) {
        go++;
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx < 1 || ny < 1 || nx>5 || ny>5) continue;
            if (vis[nx][ny]) continue;
            if (chk[lot[nx][ny]]==1) {
                vis[nx][ny] = 1;
                q.push({ nx,ny });
            }
        }
    }
    if (go == 7) {
        res++;
    }
}