본문 바로가기
BaekJoon/C++

1987 : 알파벳 (C++)

by GrayChoi 2021. 2. 9.
반응형

 

1987번: 알파벳

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

www.acmicpc.net


백트래킹기법을 사용하여 푼 문제이다.

백트래킹을 사용했기 때문에

visit배열을 따로 사용하지 않았다.

#include<iostream>
#include<string>

using namespace std;

int map[20][20];
bool check[26];

int R, C;
int result = 0;

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

void dfs(int x, int y, int cnt) {

    for(int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx >= 0 && nx < R && ny >= 0 && ny < C) { // 범위 처리
            if(check[map[nx][ny]] == false) { // 알파벳이 사용되지 않았다면
                check[map[nx][ny]] = true; // 알파벳 체크
                dfs(nx, ny, cnt + 1);
                check[map[nx][ny]] = false;
            }
        }
    }

    result = max(result, cnt);
}

int main() {
    cin >> R >> C;

    for(int i = 0; i < R; i++) {
        string temp;
        cin >> temp;
        for(int j = 0; j < C; j++) {
            map[i][j] = temp[j] - 'A';
        }
    }

    check[map[0][0]] = true;
    // 첫번째 칸인 좌측 상단 칸의 알파벳 체크

    dfs(0, 0, 1);
    // 좌표값, 카운트값

    cout << result << endl;

    return 0;
}
반응형

'BaekJoon > C++' 카테고리의 다른 글

2805 : 나무 자르기 (C++)  (0) 2021.02.10
1654 : 랜선 자르기 (C++)  (0) 2021.02.10
1934 : 최소공배수 (C++)  (0) 2021.02.09
1010 : 다리 놓기 (C++)  (0) 2021.02.09
2206 : 벽 부수고 이동하기 (C++)  (0) 2021.02.09

댓글