본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1987 알파벳

by 까망 하르방 2021. 2. 20.
반응형

출처: https://www.acmicpc.net/problem/1987

 Input 

2 4

CAAB

ADCB

  

 Output 

3

서로 다른 알파벳으로 이루어진 최대 경로

같은 알파벳이 적힌 칸을 두 번 지나갈 수 없는 조건을 확인하기 위해 

visited[26]을 사용하지 않고 비트마스크 활용

ex) 0 00000 00000 00000 00000 00011 → BA

ex) 1 00000 00000 00000 00000 00101 → ZCA


#include <iostream>
using namespace std;
#define MAX 20
 
int R, C, answer;
string board[MAX];
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
 
void DFS(int x, int y, long long alphabet, int cnt){
 
    // 현재 알파벳 표시 (비트마스크)
    alphabet |= (1 << (board[x][y] - 'A')); 
 
    for (int i = 0; i < 4; i++){
        int nextX = x + dx[i];
        int nextY = y + dy[i];
        
        if(nextX < 0 || nextX >= R || nextY < 0 || nextY >= C)
            continue;
        
        // 이미 지나온 알파벳인 경우
        if (alphabet & (1 << (board[nextX][nextY] - 'A')))
            continue;
        
        DFS(nextX, nextY, alphabet, cnt + 1);
    }
    answer = answer < cnt ? cnt : answer;
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    cin >> R >> C;
    for (int i = 0; i < R; i++)
        cin >> board[i];
    
    answer = -1;
    DFS(0, 0, (long long)1 << 26, 1); //알파벳 A(0) ~ Z(25)
    cout << answer << endl;
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 1043 거짓말  (0) 2021.02.20
[BOJ] 백준 5600 품질검사  (0) 2021.02.20
[BOJ] 백준 3987 보이저 1호  (0) 2021.02.20
[BOJ] 백준 1339 단어 수학  (0) 2021.02.20
[BOJ] 백준 5585 거스름돈  (0) 2021.02.20

댓글