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 |
Tags
- qorwns
- dfs
- C/C++ 구현
- 백준
- 스택의 특징
- 버킷 정렬
- 백준 1158
- 1764
- 5397
- 자료구조
- 백준 1406
- 해시구현
- 해시 구현
- 게리멘더링2
- 백준 17779
- c#
- 시간 복잡도
- 구현
- 백준 5397
- 별 찍기 10
- 백준 17471
- 백준 17822
- Stack 이란
- AVL 시간 복잡도
- 백준 2447
- ㅣ풀이
- heap
- 조세퍼스 순열
- 풀이
- 원판 돌리기
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 14500] 테트로미노 본문
https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누
www.acmicpc.net
요구사항
주어진 맵에서 이어진 4칸의 최대합 구하기
풀이
1. dfs로 4칸 정하기
2. 4칸의 합이 최대인지 검사
3. ㅏ모양은 dfs로 검사 안됨. ㅏ 모양이 되는 조건 확인
4. 정답 출력
#include <iostream>
#include <algorithm>
using namespace std;
int map[501][501];
int visit[501][501];
int n, m;
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,-1,0,1 };
int ans = 0;
void dfs(int r, int c, int cnt,int sum) {
if (cnt == 4) {
ans = max(ans, sum);
return;
}
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= m) {
continue;
}
if (visit[nr][nc] == 0) {
visit[nr][nc] = 1;
dfs(nr, nc, cnt + 1, sum + map[nr][nc]);
visit[nr][nc] = 0;
}
}
}
void sum1(int r, int c) {
int temp = map[r][c] + map[r + 1][c] + map[r - 1][c] + map[r][c + 1];
ans = max(ans, temp);
}
void sum2(int r, int c) {
int temp = map[r][c] + map[r -1][c] + map[r][c-1] + map[r][c + 1];
ans = max(ans, temp);
}
void sum3(int r, int c) {
int temp = map[r][c] + map[r + 1][c] + map[r - 1][c] + map[r][c - 1];
ans = max(ans, temp);
}
void sum4(int r, int c) {
int temp = map[r][c] + map[r + 1][c] + map[r][c-1] + map[r][c + 1];
ans = max(ans, temp);
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
visit[i][j] = 1;
dfs(i, j, 1,map[i][j]);
visit[i][j] = 0;
if (i > 0 && i < n - 1 && j >= 0 && j < m - 1)
sum1(i, j);
if (i > 0 && i <= n - 1 && j > 0 && j < m - 1)
sum2(i, j);
if (i > 0 && i < n - 1 && j > 0 && j <= m - 1)
sum3(i, j);
if (i >= 0 && i < n - 1 && j > 0 && j < m - 1)
sum4(i, j);
}
}
cout << ans << endl;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 17140] 이차원 배열과 연산 (0) | 2020.02.02 |
---|---|
[백준 17142] 연구소 3 (0) | 2020.02.02 |
[백준 14499] 주사위 굴리기 (0) | 2020.02.02 |
[백준 17779] 게리멘더링 2 (0) | 2020.02.01 |
[백준 13458] 시험감독 (0) | 2020.01.31 |
Comments