개발아 담하자

[백준/C++] 1987 번 : 알파벳 풀이 본문

👩‍💻 알고리즘 풀이/백준

[백준/C++] 1987 번 : 알파벳 풀이

choidam 2020. 2. 7. 02:16

문제 1987번 : 알파벳

문제 링크 : https://www.acmicpc.net/problem/1987

 

1987번: 알파벳

문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는

www.acmicpc.net

 

 

문제

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

말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.

좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.

 

입력

첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1<=R,C<=20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.

 

출력

첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.

 

  • 이전에 방문하지 않은 지점이 있닥 하덜랃 그 지점이 이전에 방문한 지점의 알파벳과 같다면 방문할 수 없다.
  • 즉, 포인트는 방문한 위치가 아니라 방문한 지점의 알파벳 이다.
  • 방문한 지점의 알파벳은 int alphabet[65] 에 저장해 두었다.

 

 

풀이

#include <iostream>

using namespace std;

int r, c;
char board[21][21];
int alphabet[26];
int ans = 0;

const int dy[] = {-1,1,0,0};
const int dx[] = {0,0,-1,1};

int max(int a, int b){
    return a > b ? a : b;
}

void dfs(int y, int x, int cnt){
    ans = max(ans, cnt);
    
    for(int i=0; i<4; i++){
        int ny = y + dy[i];
        int nx = x + dx[i];
        int k = (int)board[ny][nx]-65;
        
        if(ny<0 || nx<0 || ny>=r || nx>=c) continue;
        if(alphabet[k]) continue;
        
        alphabet[k]++;
        dfs(ny,nx,cnt+1);
        alphabet[k]--;
    }
}

int main(void){
    
    cin >> r >> c;

    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++){
            cin >> board[i][j];
        }
    }
    
    alphabet[(int)board[0][0]-65]++;
    dfs(0,0,1);
    
    cout << ans << endl;
    
    return 0;
}

 

풀이 인증