Submission #339322

# Submission time Handle Problem Language Result Execution time Memory
339322 2020-12-25T04:50:22 Z tengiz05 Riddick's Cube (IZhO13_riddicks) C++17
100 / 100
1979 ms 492 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(NULL);
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second
#define PI acos(-1)
#define ld long double
template<class T> bool ckmin(T& a, const T& b) {return a>b? a=b, true:false;}
template<class T> bool ckmax(T& a, const T& b) {return a<b? a=b, true:false;}
const int mod = 1e9+7, N = 4005;
int msb(int val){return sizeof(int)*8-__builtin_clzll(val)-1;}
int n, m, k;
int a[10][10];
int ans = 100500;
vector<int> opscol, opsrow;
int res[10][10];
int ops;
inline int shiftcol(int i, int j){
	int tt = min(j, n-j);
	for(int c=0;c<j;c++){
		res[n][i] = res[0][i];
		for(int I=0;I<n;I++){
			res[I][i] = res[I+1][i];
		}
	}return tt;
}

inline int shiftrow(int i, int j){
	int tt = min(j, m-j);
	for(int c=0;c<j;c++){
		res[i][m] = res[i][0];
		for(int I=0;I<m;I++){
			res[i][I] = res[i][I+1];
		}
	}return tt;
}

void row(int i){
	if(i == n){
		int tmp = 0;
		for(int j=0;j<n;j++){
			tmp += shiftrow(j, opsrow[j]);
		}ops += tmp;
		bool is1 = true, is2 = true;
		for(int i=0;i<n;i++){
			for(int j=1;j<m;j++)if(res[i][j] != res[i][j-1])is1 = false;
		}
		for(int i=0;i<m;i++){
			for(int j=1;j<n;j++)if(res[j][i] != res[j-1][i])is2 = false;
		}
	/*	for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)cout << res[i][j] << ' ';
			cout << '\n';
		}cout << '\n';
		*/
		for(int j=0;j<n;j++){
			shiftrow(j, m-opsrow[j]);
		}
		if(is1 || is2)ckmin(ans, ops);
		ops -= tmp;
		return;
	}
	for(int j=0;j<m;j++){
		opsrow.pb(j);
		row(i+1);
		opsrow.pop_back();
	}
}

void col(int i){
	if(i == m){
		for(int c=0;c<n;c++)for(int r=0;r<m;r++)res[c][r] = a[c][r];
		int tmp = 0;
		for(int j=0;j<m;j++){
			tmp += shiftcol(j, opscol[j]);
		}
		ops += tmp;
		row(0);
		ops -= tmp;
		return;
	}
	for(int j=0;j<n;j++){
		opscol.pb(j);
		col(i+1);
		opscol.pop_back();
	}
}

void solve(int test_case){
	int i, j;
	cin >> n >> m;
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			cin >> a[i][j];
		}
	}
	col(0);
	cout << ans << '\n';
	return;
}

signed main(){
	FASTIO;
#define MULTITEST 0
#if MULTITEST
	int _T;
	cin >> _T;
	for(int T_CASE = 1; T_CASE <= _T; T_CASE++)
		solve(T_CASE);
#else
	solve(1);
#endif
	return 0;
}




# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 11 ms 492 KB Output is correct
9 Correct 107 ms 364 KB Output is correct
10 Correct 100 ms 396 KB Output is correct
11 Correct 107 ms 384 KB Output is correct
12 Correct 102 ms 364 KB Output is correct
13 Correct 1917 ms 492 KB Output is correct
14 Correct 1913 ms 396 KB Output is correct
15 Correct 1935 ms 492 KB Output is correct
16 Correct 1920 ms 364 KB Output is correct
17 Correct 1921 ms 396 KB Output is correct
18 Correct 1932 ms 396 KB Output is correct
19 Correct 1936 ms 492 KB Output is correct
20 Correct 1979 ms 396 KB Output is correct