일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 재귀함수
- 15353
- 재귀
- 14863
- 26008
- 브루트포스
- 1781
- 삼성
- BOJ14889
- Crossfit
- C++
- 스택
- D1
- DP
- 크로스핏
- 회전하는큐
- 15662
- Flutter
- 그리디
- Python
- sw expert academy
- 서울에서경산까지
- 백준
- 4811
- dart
- spring boot
- 동적프로그래밍
- BOJ
- 해시해킹
- 1로만들기2
- Today
- Total
곧죽어도 콛잉
[그래프 / 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;
}
'Coding Test > C++' 카테고리의 다른 글
[비트마스킹 / BOJ 1094 / C++] 막대기 (0) | 2023.05.02 |
---|---|
[구현 / BOJ 14890 / C++] 경사로 (0) | 2023.04.29 |
[그래프 / BOJ 17471 / C++] 게리맨더링 (0) | 2023.04.27 |
[비트마스킹 / BOJ 1285 / C++] 동전 뒤집기 (0) | 2023.04.27 |
[브루트 포스 / BOJ 16234 / C++] 인구 이동 (0) | 2023.03.30 |