알고리즘 문제

[백준] 14500번 테트로미노

feelcoding 2021. 1. 25. 18:49
728x90

www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

그냥 노가다로 풀면 된다. 특별한 알고리즘 지식이나 기술은 필요없다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	vector<vector<int>> locationX(19);
	vector<vector<int>> locationY(19);
	locationX[0] = {0, 0, 0, 0};
	locationY[0] = { 0, 1, 2, 3 }; // 가로 일직선
	locationX[1] = { 0, 1, 2, 3 };
	locationY[1] = { 0, 0, 0, 0 }; // 세로 일직선
	locationX[2] = { 0, 0, 1, 1 };
	locationY[2] = { 0, 1, 0, 1 }; // 정사각형
	locationX[3] = { 0, 1, 2, 2 };
	locationY[3] = { 0, 0, 0, 1 }; // └
	locationX[4] = { 0, 0, 0, 1 };
	locationY[4] = { 0, 1, 2, 0 }; // ┌
	locationX[5] = { 0, 0, 1, 2 };
	locationY[5] = { 0, 1, 1, 1 }; // ┐
	locationX[6] = { 0, 0, 0, -1 };
	locationY[6] = { 0, 1, 2, 2 }; // ┘
	locationX[7] = { 0, 0, -1, -2 };
	locationY[7] = { 0, 1, 1, 1 }; // ┘
	locationX[8] = { 0, 0, 0, 1 };
	locationY[8] = { 0, 1, 2, 2 }; // ㄱ
	locationX[9] = { 0, 0, 1, 2 };
	locationY[9] = { 0, 1, 0, 0 }; // ┌
	locationX[10] = { 0, 1, 1, 1 };
	locationY[10] = { 0, 0, 1, 2 }; // ㄴ
	locationX[11] = { 0, 1, 1, 2 };
	locationY[11] = { 0, 0, 1, 1 }; // └┐
	locationX[12] = { 0, 0, -1, -1 };
	locationY[12] = { 0, 1, 1, 2 }; // ┘┌
	locationX[13] = { 0, -1, -1, -2 };
	locationY[13] = { 0, 0, 1, 1 }; // ┌┘
	locationX[14] = { 0, 0, 1, 1 };
	locationY[14] = { 0, 1, 1, 2 }; // ┐└
	locationX[15] = { 0, 0, 0, 1 };
	locationY[15] = { 0, 1, 2, 1 }; // ┬
	locationX[16] = { 0, 0, 0, -1 };
	locationY[16] = { 0, 1, 2, 1 }; // ┴
	locationX[17] = { 0, 1, 2, 1 };
	locationY[17] = { 0, 0, 0, -1 }; // ┤
	locationX[18] = { 0, 1, 2, 1 };
	locationY[18] = { 0, 0, 0, 1 }; // ├
	vector<vector<int>> v(n, vector<int>(m));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> v[i][j];
		}
	}
	int maxSum = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			for (int k = 0; k < 19; k++) {
				int sum = 0;
				for (int l = 0; l < 4; l++) {
					int row = i + locationX[k][l];
					int col = j + locationY[k][l];
					if (row >= 0 && row < n && col >= 0 && col < m) {
						sum += v[row][col];
					}
					else {
						sum = -1;
						break;
					}
				}
				if (sum > maxSum) {
					maxSum = sum;
				}
			}
		}
	}
	cout << maxSum;
	return 0;
}
728x90