回転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)