반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 후기
- 백준
- 리사이클러뷰
- 궁동
- MySQL
- 어은동맛집
- BFS
- nodeJS
- DP
- 몰입캠프
- 카이스트맛집
- 분리집합
- 알고리즘
- glfw
- node.js
- 컴퓨터그래픽스
- 앱개발
- 프로그래머스
- html
- 자바스크립트
- 대전맛집
- 몰입캠프후기
- 자바
- 타입스크립트
- computergraphics
- 카이스트
- 안드로이드스튜디오
- 프래그먼트
- 우선순위큐
- 위상정렬
Archives
- Today
- Total
소근소근
[백준 BOJ 14500 테트로미노 gold4] C++ DFS 본문
728x90
반응형
SMALL
- 총 5개의 테트로미노이고, 대칭과 회전을 포함하면 약 20개의 모양이 나온다.
- 하나씩 다 구현할 수도 있지만, 경우의 수가 너무 많다...
- 모든 점에서 dfs 를 depth 4 로 돌리는 방법으로 시작했다.
- 하지만 dfs로 구할 경우, 아래 그림 처럼 5가지 중 4가지만 구할 수 있다.
- ㅗ 이 모양에 대해서는 dfs로 구할 수 없다.
- 그래서, 모든 점에 대해 dfs를 돌린 후, 나머지 도형 한개에 대해서만 구현을 해주는 것으로 풀었다.
int N, M, ans;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,1,-1};
int score[501][501];
int visit[501][501];
bool chk_range(int x, int y) {
if (x>=1 && y>=1 && x<=N && y<=M) return true;
return false;
}
void dfs(int sc, int cnt, int x, int y) {
if (cnt == 4) {
ans = max(ans, sc);
return;
}
for (int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (chk_range(nx, ny) && visit[nx][ny] == 0) {
visit[nx][ny] = 1;
dfs(sc+score[nx][ny], cnt+1, nx, ny);
visit[nx][ny] = 0;
}
}
return;
}
int main()
{
cin >> N >> M;
for (int i=1; i<=N; i++) {
for (int j=1; j<=M; j++) {
cin >> score[i][j];
}
}
// 1. 나머지 4개 도형
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
visit[i][j] = 1;
dfs(score[i][j], 1, i, j);
visit[i][j] = 0;
}
}
// 2. 성 모양
for (int i=2; i+1<=N; i++) {
for(int j=1; j<=M; j++) {
int sero_hab = score[i][j] + score[i-1][j] + score[i+1][j];
if (chk_range(i, j-1)) { // left
ans = max(ans, sero_hab + score[i][j-1]);
}
if (chk_range(i, j+1)) { // right
ans = max(ans, sero_hab + score[i][j+1]);
}
}
}
for (int i = 1; i <= N; i++) {
for (int j = 2; j + 1 <= M; j++) {
int garo_hab = score[i][j] + score[i][j-1] + score[i][j+1];
if (chk_range(i-1, j)) { // upper
ans = max(ans, garo_hab + score[i-1][j]);
}
if (chk_range(i+1, j)) { // lower
ans = max(ans, garo_hab + score[i+1][j]);
}
}
}
cout << ans;
}
728x90
반응형
LIST
'Algorithm' 카테고리의 다른 글
[백준 BOJ 25097 Controlled Inflation gold2] C++, 그리디, Dynamic Programming (1) | 2023.04.12 |
---|---|
[프로그래머스 - 무지의 먹방 라이브] Lv.4 c++ (0) | 2023.03.26 |
[프로그래머스] 경주로 건설 (0) | 2022.05.01 |
[프로그래머스 - 오랜 기간 보호한 동물(2)] MYSQL , DATETIME , STRING (0) | 2022.02.06 |
[프로그래머스 - 중성화 여부 파악하기] MYSQL, STRING DATE (0) | 2022.02.06 |