티스토리 뷰
#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
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
'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
- 누적 합
- XOR
- Krustal
- DP
- 1835
- 문자열
- BFS
- 정렬
- C++
- C언어
- 그리디
- 최소 스패닝 트리
- 덱
- Segment Tree
- DFS
- 1835번
- 스택
- find
- PASCAL
- 세그먼트 트리
- 구현
- java
- 백준
- 브루트포스
- 누적합
- Lazy Propagation
- 그래프
- 오프라인 쿼리
- union
- 기하학
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
