BOJ
[BOJ] 백준 1987번 알파벳 C++
Doshisha
2022. 4. 5. 15:31
문제
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
풀이
DFS를 사용하는 방법으로 문제에 접근하였다.
보드의 문자 - 'A'가 0 ~ 25인점을 이용하여 26의 크기를 가진 방문 여부 배열을 만들어주었고 DFS를 돌리며 매 DFS마다 칸 수를 최댓값으로 초기화 시켜주었다. 이후 DFS가 끝나면 최댓값을 출력해주면 된다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
int result = 0;
char board[21][21];
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
bool isused[26];
void func(int x, int y, int cnt)
{
result = max(result, cnt);
for (int dir = 0; dir < 4; dir++)
{
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m)
{
continue;
}
if (!isused[board[nx][ny] - 'A'])
{
isused[board[nx][ny] - 'A'] = true;
func(nx, ny, cnt + 1);
isused[board[nx][ny] - 'A'] = false;
}
}
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> board[i][j];
}
}
isused[board[0][0] - 'A'] = true;
func(0, 0, 0);
cout << result + 1;
}