문제
https://www.acmicpc.net/problem/14500
풀이
전형적인 브루트포스 문제. 모든 도형의 경우를 전부 구하고, 그걸 좌표에 전부 대입해서 가장 큰 합을 찾으면 된다. 도형은 회전 및 뒤집기가 가능하다는 점 유의하자.
나올 수 있는 모든 도형의 경우의 수다. 이를 특정 부분에 대한 상대 좌표를 모두 맵에 넣고 해당 좌표에 위치한 숫자들의 합을 구해서 크기를 비교하고 업데이트해주면 된다.
// // 14500.cpp // BJ // // Created by 신기열 on 22/10/2019. // Copyright © 2019 신기열. All rights reserved. // #include <stdio.h> #include <iostream> #include <vector> using namespace std; int n, m; int map[500][500]; int answer = 0; void calc(int x1, int y1, int x2, int y2, int x3, int y3){ for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(i + y1 >= 0 && j + x1 >= 0 && i + y1 < n && j + x1 < m && i + y2 >= 0 && j + x2 >= 0 && i + y2 < n && j + x2 < m && i + y3 >= 0 && j + x3 >= 0 && i + y3 < n && j + x3 < m){ // int test[500][500] = { 0, }; // test[i][j] = map[i][j]; // test[i + y1][j + x1] = map[i + y1][j + x1]; // test[i + y2][j + x2] = map[i + y2][j + x2]; // test[i + y3][j + x3] = map[i + y3][j + x3]; // // for(int p = 0; p < n; p++){ // for(int q = 0; q < m; q++){ // cout << test[p][q] << " "; // } // cout << '\n'; // } // cout << '\n'; answer = max(answer, map[i][j] + map[i + y1][j + x1] + map[i + y2][j + x2] + map[i + y3][j + x3]); } } } } int main(){ cin >> n >> m; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin >> map[i][j]; } } vector<pair<int, int> > v; for(int i = 0; i < 15; i++){ v.clear(); if(i == 1){ } } calc(1, 0, 2, 0, 3, 0); calc(0, 1, 0, 2, 0, 3); calc(1, 0, 0, 1, 1, 1); calc(0, 1, 0, 2, 1, 2); calc(0, 1, 0, 2, -1, 2); calc(0, 1, 1, 0, 2, 0); calc(1, 0, 2, 0, 2, 1); calc(1, 0, 1, 1, 1, 2); calc(1, 0, 0, 1, 0, 2); calc(0, 1, 1, 1, 2, 1); calc(1, 0, 2, 0, 2, -1); calc(0, 1, 1, 1, 1, 2); calc(0, 1, -1, 1, -1, 2); calc(1, 0, 1, 1, 2, 1); calc(1, 0, 1, -1, 2, -1); calc(1, 0, 2, 0, 1, 1); // ㅜ calc(0, 1, 0, 2, 1, 1); // ㅏ calc(0, 1, -1, 1, 1, 1); // ㅗ calc(1, -1, 1, 0, 1, 1); // ㅓ cout << answer; return 0; }
댓글
댓글 쓰기