문제풀이/백준

[C++] 백준 - 1987 : 알파벳

orubt 2020. 12. 19. 20:45
반응형

문제 링크

 

1987번: 알파벳

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

www.acmicpc.net

 

풀이 )

  여태까지 풀었던 dfs에서와 달리 방문한 칸을 저장하는 배열 대신, 사용한 알파벳을 저장하는 배열을 사용했다.

  처음 (0, 0)을 시작으로 방문한 칸의 알파벳의 사용 여부를 갱신하고, 4방향에 대해서 탐색한 최댓값+1(현재칸)을 반환한다.

  각 방향에 대해 영향을 주지 않기 위해 다음 방향을 가기 전에 다음 칸 알파벳의 사용 여부를 초기화해준다.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

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

int r, c;
vector<string> board;
bool used[26];

int dfs(int x, int y){
    int ret = 0;
    used[board[x][y]-'A'] = true;
    for(int dir = 0; dir < 4; ++dir){
        int xx = x+dx[dir];
        int yy = y+dy[dir];
        if(xx < 0 || xx >= r || yy < 0 || yy >= c)
            continue;
        if(used[board[xx][yy]-'A'])
            continue;
        ret = max(ret, dfs(xx, yy));
        used[board[xx][yy]-'A'] = false;
    }
    return ret+1;
}

int main(void){
    cin >> r >> c;
    for(int i = 0; i < r; ++i){
        string s;
        cin >> s;
        board.push_back(s);
    }

    int ans = dfs(0, 0);

    cout << ans;
}
반응형