Last active
October 30, 2018 14:12
-
-
Save baactree/152464f0d0a2a2d9adac41274c01d680 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
#define MAX 30000 | |
int base[MAX], diff[MAX]; | |
bool chk[MAX]; | |
pair<int, int> vec[MAX]; | |
void flip(int mat[4][4]) { | |
for (int i = 0; i < 4; i++) { | |
swap(mat[i][0], mat[i][3]); | |
swap(mat[i][1], mat[i][2]); | |
} | |
} | |
void rotate(int mat[4][4]) { | |
int temp[4][4]; | |
for (int i = 0; i < 4; i++) { | |
for (int j = 0; j < 4; j++) { | |
temp[j][3 - i] = mat[i][j]; | |
} | |
} | |
for (int i = 0; i < 4; i++) { | |
for (int j = 0; j < 4; j++) { | |
mat[i][j] = temp[i][j]; | |
} | |
} | |
} | |
bool cmp(int a[4][4], int b[4][4]) { | |
int temp[4][4]; | |
for (int i = 0; i < 4; i++) { | |
for (int j = 0; j < 4; j++) { | |
temp[i][j] = a[i][j] + b[i][j]; | |
} | |
} | |
int p = temp[0][0]; | |
for (int i = 0; i < 4; i++) { | |
for (int j = 0; j < 4; j++) { | |
if (temp[i][j] != p)return false; | |
} | |
} | |
return true; | |
} | |
int makeBlock(int module[][4][4]) { | |
for (int i = 0; i < MAX; i++) { | |
chk[i] = false; | |
base[i] = 10; | |
for (int j = 0; j < 4; j++) { | |
for (int k = 0; k < 4; k++) { | |
base[i] = min(base[i], module[i][j][k]); | |
} | |
} | |
diff[i] = 0; | |
for (int j = 0; j < 4; j++) { | |
for (int k = 0; k < 4; k++) { | |
diff[i] = max(diff[i], module[i][j][k] - base[i]); | |
} | |
} | |
vec[i] = { base[i] + diff[i],i }; | |
} | |
sort(vec, vec + MAX); | |
int ret = 0; | |
for (int i = MAX - 1; i >= 0; i--) { | |
int idx = vec[i].second; | |
if (chk[idx])continue; | |
chk[idx] = true; | |
int temp[4][4]; | |
for (int j = 0; j < 4; j++)for (int k = 0; k < 4; k++)temp[j][k] = module[idx][j][k]; | |
flip(temp); | |
bool flag = false; | |
for (int j = 0; j < 4; j++) { | |
if (j)rotate(temp); | |
for (int k = i - 1; k >= 0; k--) { | |
int kidx = vec[k].second; | |
if (chk[kidx] || !cmp(module[kidx], temp))continue; | |
chk[kidx] = true; | |
flag = true; | |
ret += base[idx] + base[kidx] + diff[kidx]; | |
break; | |
} | |
if (flag)break; | |
} | |
} | |
return ret; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment