728x90
반응형

링크

https://www.acmicpc.net/problem/1987

 

1987번: 알파벳

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

www.acmicpc.net

해설


DFS를 아신다면 간단한 문제입니다.

 

원래 이문제를 풀 때는 스택을 사용해야 하지만 딱히 경로를 저장해야 하는 문제는 아니라서

bool can_go[26];

을 이용해서 이미 지나간 알파벳인지 아닌지만 검사해서 DFS 를 실시하면 됩니다.

 

코드

#include <iostream>
using namespace std;
char table[20][20];
int R, C, MAX = 1, NOW = 1;
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
bool can_go[26];
void DFS(int _x, int _y) {
if (NOW > MAX)
MAX = NOW;
for (int i = 0; i < 4; ++i) {
int nx = dx[i] + _x;
int ny = dy[i] + _y;
if (0 <= nx && nx < C && 0 <= ny && ny < R) {
int alp = table[ny][nx] - 'A';
if (can_go[alp]) {
can_go[alp] = false;
++NOW;
DFS(nx, ny);
--NOW;
can_go[alp] = true;
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
char in[21];
fill_n(can_go, 26, true);
cin >> R >> C;
for (int i = 0; i < R; ++i) {
cin >> in;
for (int j = 0; j < C; ++j) {
table[i][j] = in[j];
}
}
can_go[table[0][0] - 'A'] = false;
DFS(0, 0);
cout << MAX;
return 0;
}



728x90
반응형

'컴퓨터공학 > 백준' 카테고리의 다른 글

[백준][2580][C++] 스도쿠  (0) 2021.07.04
[백준][1806][C++] 부분합  (0) 2021.07.03
[백준][17298][C++] 오큰수  (0) 2021.07.02
[백준][9251][C++] LCS  (0) 2021.07.01
[백준][2206][C++] 벽 부수고 이동하기  (0) 2021.06.30

+ Recent posts