CS/baekjoon
[백준 1987번] 알파벳
hanjongho
2021. 4. 7. 15:13
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
풀이)
각 상태에서 사용된 알파벳을 체크해주면서 dfs를 돌리면 해결되었다. 이미 왔던 곳은 usedAlphabet으로 체크가 되기 때문에 visited배열은 따로 만들지 않았다.
#include <iostream>
using namespace std;
int R, C, usedAlphabet[26], ans = 0;
int dir_x[4] = {0, 0, 1, -1};
int dir_y[4] = {1, -1, 0, 0};
string board[21];
void dfs(int x, int y, int cnt)
{
if (cnt > ans)
ans = cnt;
usedAlphabet[board[x][y] - 'A'] = 1;
for (int i = 0; i < 4; i++)
{
int nx = x + dir_x[i];
int ny = y + dir_y[i];
if (nx < 0 || ny < 0 || nx > R - 1 || ny > C - 1)
continue;
if (!usedAlphabet[board[nx][ny] - 'A'])
{
dfs(nx, ny, cnt + 1);
usedAlphabet[board[nx][ny] - 'A'] = 0;
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> R >> C;
for (int i = 0; i < R; i++)
cin >> board[i];
dfs(0, 0, 1);
cout << ans << "\n";
return (0);
}
제 코드는 절대 완벽하지 않습니다
더 좋은 풀이방법 혹은 코드에 관한 질문이 있으시면 언제든 댓글주세요!