Algorithm
[백준] 알파벳 1987번 (c++)
salmon16
2021. 9. 9. 15:35
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
풀이 방법
bfs로 풀지 dfs로 풀지 고민하다 지금 까지 지나온 알파벳을 저장하고 알파벳 방문 여부를 판단하기에
dfs가 더 적합할 거 같아서 dfs 로 풀이하였다.
알파벳은 26개의 배열을 만들어 방문했으면 배열에 1로 두고 두 번 방문하지 않게 하였다.
그리고 백트레킹을 활용하여 더 이상 갈 곳이 없으면 배열을 다시 초기화하여서 다른 방향에서 방문을 할 수 있도록
하였다.
#include<bits/stdc++.h>
using namespace std;
vector<string> board;
int alphabet [26];
int visited[21][21];
int dy[4] = {0, 0, 1, -1};
int dx[4] = {1, -1, 0, 0};
int R, C, ans = 0;
void dfs(int y,int x, int cnt) {
if (cnt > ans) ans = cnt;
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 && visited[ny][nx] == 0) {
if (alphabet[board[ny][nx] - 'A'] == 0 ) {
visited[ny][nx] = 1;
alphabet[board[ny][nx] - 'A'] = 1;
dfs(ny, nx, cnt + 1);
visited[ny][nx] = 0;
alphabet[board[ny][nx] - 'A'] = 0;
}
}
}
}
int main(){
memset(visited, 0, sizeof(visited));
memset(alphabet, 0, sizeof(alphabet));
cin >> R >> C;
for (int i = 0;i < R;i++) {
string str;
cin >>str;
board.push_back(str);
}
visited[0][0] = 1;
alphabet[board[0][0] - 'A'] = 1;
dfs(0, 0, 1);
cout << ans;
return 0;
}