https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
일단 처음 시작이 점 어려운데 이해하면 쉽네요
가장 먼저 2x2 ,4x1, 1x4 사각형들은 그냥 합을 구하면 되고요
문제가되는 2x3, 3x2 사 격형들이 문제인데
이 사각형의 2x3, 3x2의 들어가는 숫자를 전부 합친 다음에, 그 사각형 격자에 빠지는 값들을 빼서 그 합중 가장 큰값을 구하면 바로 해결됩니다. 조금 만드는데 시간이 걸리는 문제라 생각자체는 어렵진 않네요
#include <iostream>
#include <vector>
#include <queue>
#include<string>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#include<map>
#include<stack>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//폴리오미노 크기가 1x1 정사각형을 여러개 붙인 도형
//정사각형이 서로 겹치면 안된다.
//도형은 모두 연결되어야한다
//정사각형의 변끼리 연결되어 있어야한다. 즉 꼭짓점과 꼭짓점만 맞닿아 있으면 안된다
//정사각형 4개를 이어붙인 테트로모니 5가지 갓이다
//nxm인 종이 위에 테트로미노 하나를 놓으려고 한다.
int n, m;
cin >> n >> m;
vector<vector<int>>maps;
for (int i = 0; i < n; i++) {
vector<int>tmpMaps;
for (int j = 0; j < m; j++) {
int tmp;
cin >> tmp;
tmpMaps.push_back(tmp);
}
maps.push_back(tmpMaps);
}
int sum = 0;
for (int k = 0; k < 5 ; k++) {
for (int z = 0; z < maps.size(); z++) {
//2x2
for (int t = 0; t < maps[z].size(); t++) {
//square
int width = 0;//2;
int height = 0;//2;
int squre = 0;
if (k == 0) {
width = 2;
height = 2;
}
else if (k == 1) {
width = 1;
height = 4;
}
else if (k == 2) {
width = 4;
height = 1;
}
else if (k == 3) {
width =2;
height = 3;
}
else if (k == 4) {
width = 3;
height = 2;
}
int squreheight = height + z;
int squrewidth = width + t;
if (squreheight > maps.size() || squrewidth > maps[z].size()) {
continue;
}
int tmpsum = 0;
vector<int> tmpsumarray;
for (int i = z; i < squreheight; i++) {
for (int j = t; j < squrewidth; j++) {
tmpsum += maps[i][j];
}
}
if (k == 0 || k == 1 || k == 2) {
sum = max(tmpsum, sum);
}
else if (k == 3) {
tmpsumarray.push_back(tmpsum - maps[z][squrewidth - 1] - maps[squreheight - 1][t]);
tmpsumarray.push_back(tmpsum - maps[z][t] - maps[squreheight - 1][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[z][t] - maps[squreheight - 1][t]);
tmpsumarray.push_back(tmpsum - maps[z][squrewidth - 1] - maps[squreheight - 1][squrewidth - 1]);
tmpsumarray.push_back(tmpsum-maps[z][t]-maps[z+1][t]);
tmpsumarray.push_back(tmpsum - maps[squreheight - 1][squrewidth - 1] - maps[squreheight - 2][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[squreheight - 1][t] - maps[squreheight - 2][t]);
tmpsumarray.push_back(tmpsum - maps[z][squrewidth - 1] - maps[z+1][squrewidth - 1]);
sort(tmpsumarray.begin(), tmpsumarray.end(),greater<>());
sum = max(tmpsumarray[0], sum);
tmpsumarray.clear();
}
else if (k==4) {
tmpsumarray.push_back(tmpsum - maps[z][t] - maps[squreheight - 1][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[squreheight - 1][t] - maps[z][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[z][t] - maps[z][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[squreheight - 1][t] - maps[squreheight - 1][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[z][t] - maps[z][t+1]);
tmpsumarray.push_back(tmpsum - maps[z][t+1] - maps[z][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[squreheight - 1][squrewidth - 2] - maps[squreheight - 1][squrewidth - 1]);
tmpsumarray.push_back(tmpsum - maps[squreheight - 1][t] - maps[squreheight - 1][t+1]);
sort(tmpsumarray.begin(), tmpsumarray.end(),greater<>());
sum = max(tmpsumarray[0], sum);
tmpsumarray.clear();
}
}
}
}
cout << sum;
return 0;
}
'알고리즘 공부' 카테고리의 다른 글
백준 빙산 (1) | 2023.10.04 |
---|---|
백준 가장 긴 바이토닉 부분 수열 (1) | 2023.09.29 |
백준 카드 정렬하기 (0) | 2023.09.28 |
백준 감소하는 수 (0) | 2023.09.26 |
백준 이분 그래프 (0) | 2023.09.23 |