티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/1987

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

풀이

모든 경로를 찾기 위해 dfs를 돌려줍니다.

얼핏 생각하면 복잡도가 터져 나갈 것 같지만 격자 그래프, 작은 범위, 지나간 알파벳은 다시 못 지나간다는 제한 사항 때문에 시간 안에 가능합니다.

 

저는 알파벳 체킹을 비트 마스크로 했지만 체크 배열을 만들어도 무방합니다.

 

정답 코드

#include <bits/stdc++.h>
using namespace std;

int n, m;
string p[22];
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

bool isValid(int x, int y) {
    return 0 <= x && x < n && 0 <= y && y < m;
}

int go(int s, int x, int y) {
    int ret = 0;
    for (int k = 0; k < 4; k++) {
        int nx = x + dx[k], ny = y + dy[k];
        if (!isValid(nx, ny)) continue;
        int num = p[nx][ny] - 'A';
        if (s & (1 << num)) continue;
        ret = max(ret, go(s | (1 << num), nx, ny));
    }
    return ret + 1;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> p[i];
    }

    cout << go(1 << (p[0][0] - 'A'), 0, 0);
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 2166 다각형의 면적  (0) 2021.03.08
[BOJ] 백준 2143 두 배열의 합  (0) 2021.03.08
[BOJ] 백준 1806 부분합  (0) 2021.03.08
[BOJ] 백준 1799 비숍  (0) 2021.03.08
[BOJ] 백준 1647 도시 분할 계획  (0) 2021.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함