반응형
문제출처:https://www.acmicpc.net/problem/14500
시뮬레이션문제입니다.
차근차근 하나의 도형의 경우를 수를 적용해보셔야 합니다.
반복문 작성시 매번 테스트케이스를 입력해보면서 조기에 오류를 찾아야합니다...
다 작성하고 예외를 찾으려고 하면 절대 못찾아요....
주의하셔야 할 조건은 회전이나 대칭을 시켜도 된다 입니다.
1번 도형같은 경우에는 2가지 모양이 나옵니다.
한가지 좌우로 대칭하고 돌려도 한가지 모양만 나옵니다.
제일 괴랄한 모양으로 돌리고 대칭함으로써 총 8가지의 모양이 나옵니다.
대칭과 회전시 중복하는 모양이 생기기때문에 총 4가지 모양이 나옵니다.
역시 대칭과 회전시 중복하는 모양이 생기기때문에 총 4가지 모양이 나옵니다.
아래는 정답코드입니다.
코드확인해 보시고 꼭 직접 작성해서 풀어보세요 :)
#include <iostream>
using namespace std;
/*
1번은 회전이 가능한 4가지 경우 -> 아래 오른쪽만 해주면 됨
3번 부터는 회전이나 대칭을 시키는게 가능하기에 각 8가지
*/
int n = 0, m = 0, result = 0;
int arr[501][501] = { 0 };
void num1() {
for (int i = 0; i < n; i++)
for (int j = 0; j <= m - 4; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i][j + 3]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i][j + 3]);
for (int i = 0; i < m; i++)
for (int j = 0; j <= n - 4; j++)
if ((arr[j][i] + arr[j + 1][i] + arr[j + 2][i] + arr[j + 3][i]) > result) result = (arr[j][i] + arr[j + 1][i] + arr[j + 2][i] + arr[j + 3][i]);
}
void num2() {
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < m - 1; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i + 1][j] + arr[i + 1][j + 1]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i + 1][j] + arr[i + 1][j + 1]);
}
void num3() {
// 기본 모양
for (int i = 0; i < m - 1; i++)
for (int j = 0; j <= n - 3; j++)
if ((arr[j][i] + arr[j + 1][i] + arr[j + 2][i] + arr[j + 2][i + 1]) > result) result = (arr[j][i] + arr[j + 1][i] + arr[j + 2][i] + arr[j + 2][i + 1]);
// 기본 대칭
for (int i = 1; i < m; i++)
for (int j = 0; j <= n - 3; j++)
if ((arr[j][i] + arr[j + 1][i] + arr[j + 2][i] + arr[j + 2][i - 1]) > result) result = (arr[j][i] + arr[j + 1][i] + arr[j + 2][i] + arr[j + 2][i - 1]);
//위로 90도
for (int i = 1; i < n; i++)
for (int j = 0; j <= m - 3; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i - 1][j + 2]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i - 1][j + 2]);
//위로 90도 대칭
for (int i = 0; i < n - 1; i++)
for (int j = 0; j <= m - 3; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i + 1][j + 2]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i + 1][j + 2]);
// 위로 180도
for (int i = 2; i < n; i++)
for (int j = 1; j < m; j++)
if ((arr[i][j] + arr[i - 1][j] + arr[i - 2][j] + arr[i - 2][j - 1]) > result) result = (arr[i][j] + arr[i - 1][j] + arr[i - 2][j] + arr[i - 2][j - 1]);
// 위로 180도 대칭
for (int i = 2; i < n; i++)
for (int j = 0; j < m - 1; j++)
if ((arr[i][j] + arr[i - 1][j] + arr[i - 2][j] + arr[i - 2][j + 1]) > result) result = (arr[i][j] + arr[i - 1][j] + arr[i - 2][j] + arr[i - 2][j + 1]);
// 위로 270도
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < m - 2; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i + 1][j]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i + 1][j]);
// 위로 270도 대칭
for (int i = 1; i < n; i++)
for (int j = 0; j < m - 2; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i - 1][j]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i - 1][j]);
}
void num4() {
// 원래
for (int i = 0; i < n - 2; i++)
for (int j = 0; j < m - 1; j++)
if ((arr[i][j] + arr[i + 1][j] + arr[i + 1][j + 1] + arr[i + 2][j + 1]) > result) result = (arr[i][j] + arr[i + 1][j] + arr[i + 1][j + 1] + arr[i + 2][j + 1]);
//원래 대칭
for (int i = 0; i < n - 2; i++)
for (int j = 1; j < m; j++)
if ((arr[i][j] + arr[i + 1][j] + arr[i + 1][j - 1] + arr[i + 2][j - 1]) > result) result = (arr[i][j] + arr[i + 1][j] + arr[i + 1][j - 1] + arr[i + 2][j - 1]);
//위로 90도
for (int i = 1; i < n; i++)
for (int j = 0; j < m - 2; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i - 1][j + 1] + arr[i - 1][j + 2]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i - 1][j + 1] + arr[i - 1][j + 2]);
//위로 90도 대칭
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < m - 2; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i + 1][j + 1] + arr[i + 1][j + 2]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i + 1][j + 1] + arr[i + 1][j + 2]);
}
void num5() {
// ㅜ
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < m - 2; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i + 1][j + 1] + arr[i][j + 2]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i + 1][j + 1] + arr[i][j + 2]);
// ㅗ
for (int i = 1; i < n; i++)
for (int j = 0; j < m - 2; j++)
if ((arr[i][j] + arr[i][j + 1] + arr[i - 1][j + 1] + arr[i][j + 2]) > result) result = (arr[i][j] + arr[i][j + 1] + arr[i - 1][j + 1] + arr[i][j + 2]);
// ㅏ
for (int i = 0; i < n - 2; i++)
for (int j = 0; j < m - 1; j++)
if ((arr[i][j] + arr[i + 1][j] + arr[i + 2][j] + arr[i + 1][j + 1]) > result) result = (arr[i][j] + arr[i + 1][j] + arr[i + 2][j] + arr[i + 1][j + 1]);
// ㅓ
for (int i = 0; i < n - 2; i++)
for (int j = 1; j < m; j++)
if ((arr[i][j] + arr[i + 1][j] + arr[i + 2][j] + arr[i + 1][j - 1]) > result) result = (arr[i][j] + arr[i + 1][j] + arr[i + 2][j] + arr[i + 1][j - 1]);
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> arr[i][j];
num1();
num2();
num3();
num4();
num5();
cout << result << "\n";
}
반응형
'알고리즘 > 시뮬레이션' 카테고리의 다른 글
[백준] 11559-Puyo Puyo(C++) (0) | 2020.05.03 |
---|---|
[백준] 14891-톱니바퀴(C++) (0) | 2020.04.28 |
[백준] 1021-회전하는 큐(C++) (0) | 2020.04.02 |
[백준] 14499-주사위 굴리기 (0) | 2020.01.29 |
[백준] 3190-뱀 (0) | 2020.01.29 |