[그래프 / BOJ 1987 / C++] 알파벳
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
1)
1-1) 만약 채워졌다면, 그 숫자를 확인한 후 개수를 세준다.
1-2) 만약 안채워졌다면, 사각형을 9등분한 후 각 사각형마다 다시 1) 과정을 반복한다.
이 문제도 역시 아래 문제를 풀고오면 이해가 더 쉬워진다!!
https://die-will-coding.tistory.com/38#comment14785555
[그래프 / BOJ 1325 / C++] 효율적인 해킹
https://www.acmicpc.net/problem/1325 B)은 성립되지 안되는 걸 꼭 짚고 가야한다. 나는 그걸 착각해서 고생을 좀 많이했다 ㅠㅠ 문제를 꼭 제대로 읽자. (나만 바보였을지도...^) bfs로 트리를 순회하는데,
die-will-coding.tistory.com
백트래킹으로 모든 경우의 수를 탐색하면 깔끔하게 해결할 수 있다.
그림을 그리면 이해가 빠르다!
이 예시를 'C' (1,1)에서 시작하여 모든 경우의 수를 탐색하는 방법을 보자.
(사실 LEVEL2의 A를 택하면 C라는 선택지가 생기는데, 이는 지금은 무시한다고 생각하자.)
최대로 말이 갈 수 있는 칸 수를 찾으면 되니깐, LEVEL의 최댓값을 구하면 끝나는 문제다!!
기존 2차원배열에서의 dfs 형식에 중복되는 알파뱃은 제거한다는 로직을 넣어주면 간단하게 해결된다.
이 문제 역시 dfs의 return 값은 int로 넘긴다는 사실을 잊지말자!!
이 return의 int 값은 level이다!!
#include <bits/stdc++.h>
using namespace std;
int R, C, res;
int bd[25][25];
int useAlph[26];
int dy[4] = {0, -1, 0, 1};
int dx[4] = {1, 0, -1, 0};
int dfs(int y, int x, int level){
useAlph[bd[y][x]] = 1; // 해당 알파뱃 사용 체크.
int ret = level;
for(int i = 0 ; i < 4 ; i++){
int ny = y + dy[i];
int nx = x + dx[i];
if(ny > R || nx > C || ny <= 0 || nx <= 0) continue;
if(useAlph[bd[ny][nx]]) continue; // 해당 알파벳이 사용됐다면 무시.
ret = max(ret, dfs(ny, nx, level+1));
useAlph[bd[ny][nx]] = 0; // 원래대로 돌려주기
}
return ret;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> R >> C;
for(int i = 1 ; i <= R ; i++){ // (1.1) 부터 시작.
string s="";
cin >> s;
for(int j = 0 ; j < C ; j++){
bd[i][j+1] = (s[j]-'A'); // 0~26으로 알파뱃 표현.
}
}
res = dfs(1,1,1);
cout << res;
}