Skip to content

Instantly share code, notes, and snippets.

@baactree
Last active October 30, 2018 14:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save baactree/152464f0d0a2a2d9adac41274c01d680 to your computer and use it in GitHub Desktop.
Save baactree/152464f0d0a2a2d9adac41274c01d680 to your computer and use it in GitHub Desktop.
#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