回転BOJ-17406アレイ4
必要な知識
シミュレーション
コンポジット
フルナビゲーション
に近づく
演算の組み合わせを求める.
これらの演算の組み合わせが決定された場合、演算は順次実行される.
配列A値を更新します.
すべての演算の組み合わせに基づいて繰り返します.
per(i)
:最初の演算の位置が見つかります.すべての演算が位置を見つけ、それらの組合せを求めるまで再帰的に検索します.go(pi it)
:演算された情報をパラメータにより伝達し、演算を実行する(時計回りに回転する)cal()
:すべての演算が完了した後、その配列の値を求めるcopy()
:演算コンビネーションが作成されるたびに、入力された配列値に初期化されます.コード(C+)
#include <iostream>
#include <algorithm>
#include <limits.h>
#include <vector>
using namespace std;
typedef struct pi {
int r, c, s;
};
vector<pi>v;
int n, m, k, ans = INT_MAX, map[51][51], tmap[51][51], ttmap[51][51], chk[6];
void copy() {
for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) tmap[i][j] = map[i][j];
return;
}
void cal() {
int res = INT_MAX;
for (int i = 1; i <= n; i++) {
int tmp = 0;
for (int j = 1; j <= m; j++) {
tmp += tmap[i][j];
}
res = min(res, tmp);
}
ans = min(ans, res);
return;
}
void go(pi it) {
int t = 1;
ttmap[it.r][it.c] = tmap[it.r][it.c];
while (t <= it.s) {
//위
for (int x = it.c - t; x < it.c - t + 2 * t; x++) ttmap[it.r - t][x + 1] = tmap[it.r - t][x];
//아
for (int x = it.c + t; x > it.c + t - 2 * t; x--) ttmap[it.r + t][x -1] = tmap[it.r + t][x];
//오
for (int y = it.r - t; y < it.r - t + 2 * t; y++) ttmap[y+1][it.c+t] = tmap[y][it.c+t];
//왼
for (int y = it.r + t; y > it.r + t - 2 * t; y--) ttmap[y-1][it.c-t] = tmap[y][it.c-t];
t++;
}
for (int i = it.r - it.s; i <= it.r + it.s; i++) for (int j = it.c - it.s; j <= it.c + it.s; j++) tmap[i][j] = ttmap[i][j];
return;
}
void per(int pos) {
if (pos == k+1) {
copy();
for(int i=0;i<k;i++){
go(v[chk[i]-1]);
}
cal();
return;
}
for (int i = 0; i < k; i++) {
if (!chk[i]) {
chk[i] = pos;
per(pos + 1);
chk[i] = 0;
}
}
return;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> map[i][j];
for (int i = 0; i < k; i++) {
pi tmp; cin >> tmp.r >> tmp.c >> tmp.s;
v.push_back(tmp);
}
per(1);
cout << ans;
return 0;
}
next permutationを適用するコード(C++)
#include <iostream>
#include <algorithm>
#include <limits.h>
#include <vector>
using namespace std;
typedef struct pi {
int r, c, s;
};
vector<pi>v;
vector<int>vv;
int n, m, k, ans = INT_MAX, map[51][51], tmap[51][51], ttmap[51][51];
void copy() {
for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) tmap[i][j] = map[i][j];
return;
}
void cal() {
int res = INT_MAX;
for (int i = 1; i <= n; i++) {
int tmp = 0;
for (int j = 1; j <= m; j++) {
tmp += tmap[i][j];
}
res = min(res, tmp);
}
ans = min(ans, res);
return;
}
void go(pi it) {
int t = 1;
ttmap[it.r][it.c] = tmap[it.r][it.c];
while (t <= it.s) {
//상
for (int x = it.c - t; x < it.c - t + 2 * t; x++) ttmap[it.r - t][x + 1] = tmap[it.r - t][x];
//하
for (int x = it.c + t; x > it.c + t - 2 * t; x--) ttmap[it.r + t][x -1] = tmap[it.r + t][x];
//우
for (int y = it.r - t; y < it.r - t + 2 * t; y++) ttmap[y+1][it.c+t] = tmap[y][it.c+t];
//좌
for (int y = it.r + t; y > it.r + t - 2 * t; y--) ttmap[y-1][it.c-t] = tmap[y][it.c-t];
t++;
}
for (int i = it.r - it.s; i <= it.r + it.s; i++) for (int j = it.c - it.s; j <= it.c + it.s; j++) tmap[i][j] = ttmap[i][j];
return;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> map[i][j];
for (int i = 0; i < k; i++) {
pi tmp; cin >> tmp.r >> tmp.c >> tmp.s;
v.push_back(tmp);
vv.push_back(i);
}
do {
copy();
for (int i = 0; i < k; i++) {
go(v[vv[i]]);
}
cal();
} while (next_permutation(vv.begin(), vv.end()));
cout << ans;
return 0;
}
結果(上:next permutation)
Reference
この問題について(回転BOJ-17406アレイ4), 我々は、より多くの情報をここで見つけました https://velog.io/@hschoi1104/BOJ-17406-배열-돌리기-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol