PS

BOJ 1987 - 알파벳

728x90

www.acmicpc.net/problem/1987

 

1987번: 알파벳

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

www.acmicpc.net

 

DFS 와 Backtracking 을 혼합해서 풀어야 하는 문제였다.

DFS 로 (y, x) 지점을 방문하면서 이동할 수 있는 지역이 있으면 

이동할 수 있는 새 지역 (ny, nx) 에 대해서 DFS 를 수행해준다

그리고 DFS 가 끝나는 때에 다시 초기 상태로 돌려놓는 백트래킹을 수행한다.

최대한으로 이동할 수 있는 칸의 수를 찾아내야 하므로

DFS 를 돌릴 때, y, x 좌표 뿐 아니라, cnt 라는 변수 하나 더 넣어서 몇번 이동했는지 계산한다

그리고 그 중 가장 큰 값을 답으로 정한다.

 

 

- c++

 

#include <algorithm>
#include <iostream>
 
using namespace std;
 
int r, c, answer;
int dy[4= {-1100};
int dx[4= {00-11};
bool alphabet[26];
bool visited[21][21];
char adj[21][21];
 
void dfs(int y, int x, int cnt) {
    answer = max(answer, cnt);
    visited[y][x] = true;
    alphabet[adj[y][x] - 'A'= true;
 
    for (int i = 0; i < 4++i) {
        int ny = y + dy[i];
        int nx = x + dx[i];
 
        if (ny <= 0 || ny > r || nx <= 0 || nx > c) continue;
        if (!visited[ny][nx] && !alphabet[adj[ny][nx] - 'A']) {
            dfs(ny, nx, cnt + 1);
        }
    }
 
    alphabet[adj[y][x] - 'A'= false;
    visited[y][x] = false;
}
 
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);
 
    cin >> r >> c;
 
    for (int i = 1; i <= r; ++i)
        for (int j = 1; j <= c; ++j)
            cin >> adj[i][j];
 
    dfs(111);
    cout << answer;
 
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 16234 - 인구 이동  (0) 2020.12.21
BOJ 2580 - 스도쿠  (0) 2020.12.20
BOJ 5430 - AC  (0) 2020.12.16
BOJ 11403 - 경로 찾기  (0) 2020.12.15
BOJ 11404 - 플로이드  (0) 2020.12.15