[BOJ] 14500. トロミノ
3039 ワード
トロミノ
アルゴリズム区分:実装,Brootforce
質問する
ポリオミの黄色の大きさは1×複数の1人の正方形でつながっている図形で、以下の条件を満たす必要があります.
正方形は互いに重なり合ってはいけない.
図形はすべてつながっていなければなりません.
正方形の辺はつながっていなければならない.つまり、必ずしも頂点と重なる必要はありません.
4つの正方形を結ぶポリオミノをトロミノといい、以下の5種類があります.
美しい大きさはN×Mの紙にトロミノを置きます.紙は1×1つの大きさのセルに分けられ、各セルに整数が書かれています.
1つのトロミノを適当な位置に置いて、プログラムを書いて、トロミノを置いた格子に書いた数字の和を最大化します.
トロミノは正方形を置いて正確にセルを含み、回転したり対称にしたりする必要があります.
入力
第1行目は、用紙の長手方向サイズNおよび横方向サイズMを与える.(4 ≤ N, M ≤ 500)
2行目からN行の紙に数字が書いてあります.i 1行目のj個の数字は、上からiの1番目のセル、左からjの1番目のセルに書かれた数字である.入力は1000を超えない自然数を与えます.
しゅつりょく
最初の行では、トロミノが格子に置かれた数字の和の最値を出力します.
入力例1
5 5
1 2 3 4 5
5 4 3 2 1
2 3 4 5 6
6 5 4 3 2
1 2 1 2 1
サンプル出力1
19
入力例2
4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
サンプル出力2
20
入力例3
4 10
1 2 1 2 1 2 1 2 1 2
2 1 2 1 2 1 2 1 2 1
1 2 1 2 1 2 1 2 1 2
2 1 2 1 2 1 2 1 2 1
サンプル出力3
7
問題を解く
ソースコード
#include <bits/stdc++.h>
using namespace std;
int n, m;
int graph[501][501];
void solve();
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for(int i = 1; i < n + 1; i++) {
for(int j = 1; j < m + 1; j++) {
cin >> graph[i][j];
}
}
solve();
return 0;
}
void solve() {
int result = 0;
int dx[][3] = {
{0, 0, 0},
{1, 2, 3},
{0, 1, 1},
{0, -1, -2},
{1, 1, 1},
{0, 1, 2},
{-1, -1, -1},
{0, -1, -2},
{-1, -1, -1},
{0, 1, 2},
{1, 1, 1},
{1, 1, 2},
{0, -1, -1},
{1, 1, 2},
{0, 1, 1},
{-1, -1, -1},
{1, 0, -1},
{1, 1, 1},
{1, 0, -1}
};
int dy[][3] = {
{1, 2, 3},
{0, 0, 0},
{1, 0, 1},
{-1, -1, -1},
{0, -1, -2},
{1, 1, 1},
{0, 1, 2},
{1, 1, 1},
{0, -1, -2},
{-1, -1, -1},
{0, 1, 2},
{0, 1, 1},
{1, 1, 2},
{0, -1, -1},
{1, 1, 2},
{-1, 0 , 1},
{-1, -1, -1},
{-1, 0, 1},
{1, 1, 1}
};
for(int i = 1; i < n + 1; i++) {
for(int j = 1; j < m + 1; j++) {
for(int k = 0; k < 19; k++) {
int temp = graph[i][j];
bool compare = true;
for(int d = 0; d < 3; d++) {
int nx = i + dx[k][d];
int ny = j + dy[k][d];
if(0 < nx && nx <= n && 0 < ny && ny <= m) {
temp += graph[nx][ny];
}
else {
compare = false;
break;
}
}
if(compare) {
result = max(result, temp);
}
}
}
}
cout << result << endl;
}
#include <bits/stdc++.h>
using namespace std;
int n, m;
int graph[501][501];
void solve();
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for(int i = 1; i < n + 1; i++) {
for(int j = 1; j < m + 1; j++) {
cin >> graph[i][j];
}
}
solve();
return 0;
}
void solve() {
int result = 0;
int dx[][3] = {
{0, 0, 0},
{1, 2, 3},
{0, 1, 1},
{0, -1, -2},
{1, 1, 1},
{0, 1, 2},
{-1, -1, -1},
{0, -1, -2},
{-1, -1, -1},
{0, 1, 2},
{1, 1, 1},
{1, 1, 2},
{0, -1, -1},
{1, 1, 2},
{0, 1, 1},
{-1, -1, -1},
{1, 0, -1},
{1, 1, 1},
{1, 0, -1}
};
int dy[][3] = {
{1, 2, 3},
{0, 0, 0},
{1, 0, 1},
{-1, -1, -1},
{0, -1, -2},
{1, 1, 1},
{0, 1, 2},
{1, 1, 1},
{0, -1, -2},
{-1, -1, -1},
{0, 1, 2},
{0, 1, 1},
{1, 1, 2},
{0, -1, -1},
{1, 1, 2},
{-1, 0 , 1},
{-1, -1, -1},
{-1, 0, 1},
{1, 1, 1}
};
for(int i = 1; i < n + 1; i++) {
for(int j = 1; j < m + 1; j++) {
for(int k = 0; k < 19; k++) {
int temp = graph[i][j];
bool compare = true;
for(int d = 0; d < 3; d++) {
int nx = i + dx[k][d];
int ny = j + dy[k][d];
if(0 < nx && nx <= n && 0 < ny && ny <= m) {
temp += graph[nx][ny];
}
else {
compare = false;
break;
}
}
if(compare) {
result = max(result, temp);
}
}
}
}
cout << result << endl;
}
Reference
この問題について([BOJ] 14500. トロミノ), 我々は、より多くの情報をここで見つけました https://velog.io/@dl-00-e8/BOJ-14500.-테트로미노テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol