티스토리 뷰
#include <stdio.h>
int max = 0;
int r, c;
char map[21][21] = {};
char v[21][21] = {}; //방문했는가?
char a[26] = {}; //이 알파벳을 이전에 만났는가?
void dfs(int i, int j, int k) {
if(k>=max) max = k;
int tmp = map[i][j]-'A';
if(i>=0 && i<r && j+1 < c) { //right
if(!a[tmp] && !v[i][j]) {
a[tmp] = 1;
v[i][j] = 1;
dfs(i, j+1, k+1);
v[i][j] = 0;
a[tmp] = 0;
}
}
if(i>=0 && i<r && j-1 >= 0) { //left
if(!a[tmp] && !v[i][j]) {
a[tmp] = 1;
v[i][j] = 1;
dfs(i, j-1, k+1);
v[i][j] = 0;
a[tmp] = 0;
}
}
if(j>=0 && j<c && i+1 < r) { //down
if(!a[tmp] && !v[i][j]) {
a[tmp] = 1;
v[i][j] = 1;
dfs(i+1, j, k+1);
v[i][j] = 0;
a[tmp] = 0;
}
}
if(j>=0 && j<c && i-1 >= 0) { //up
if(!a[tmp] && !v[i][j]) {
a[tmp] = 1;
v[i][j] = 1;
dfs(i-1, j, k+1);
v[i][j] = 0;
a[tmp] = 0;
}
}
}
int main(void) {
scanf("%d %d", &r, &c);
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
scanf(" %c", &map[i][j]);
}
}
dfs(0, 0, 0);
printf("%d", max);
}
풀이 : 백트래킹, dfs
1. 문자들을 입력받는다.
2. 상하좌우로 이동할 수 있는 지를 보고, 이미 지나왔는지, 아니면 이미 만났던 알파벳인지를 확인 한다음
조건에 만족하면 재귀함수를 또 호출 하는 형식으로 만들었다.
3. 최대 어디까지 깊숙히 들어갔는지를 max에 넣어주었다.
다른사람들에 비해 시간이 매우 오래걸리는 코드이므로, 다른것을 참고하는 것을 추천드립니다.
https://www.acmicpc.net/problem/1987
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 1644번 소수의 연속합 (백준) (0) | 2023.03.18 |
---|---|
c언어 10942 팰린드롬 (백준) (0) | 2023.03.18 |
c언어 16120번 PPAP (백준) (0) | 2023.03.18 |
c언어 6198번 옥상 정원 꾸미기 (백준) (0) | 2023.03.15 |
c언어 2493번 탑 (백준) (0) | 2023.03.12 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 6198
- 정렬
- C언어
- Krustal
- C++
- 플로이드
- 세그먼트 트리
- 카드
- 6198번
- 최대공약수
- 누적 합
- 백준
- 16120번
- DFS
- 1835
- 스택
- union
- DP
- BFS
- 트리
- 그리디
- 누적합
- 덱
- 1835번
- 그래프
- java
- find
- 오프라인 쿼리
- 최소 스패닝 트리
- Mo.s
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함