给定一个魔方展开图,该魔方的同一个角上的两片贴纸被打乱,且被扭了不超过三次(扭的是侧面,不是中间层,且扭的角度固定为90度)
调急眼了……
code:
#include <bits/stdc++.h>
using namespace std;
string mb[10] = {
"",
" ***111******",
" ***111******",
" ***111******",
" 222333444555",
" 222333444555",
" 222333444555",
" ***666******",
" ***666******",
" ***666******"
};
struct mf {
string c[10];
void print () {
for (int i = 1; i <= 9; i ++) {
for (int j = 1; j <= 12; j ++) cout << c[i][j];
cout << endl;
}
}
};
mf change (mf now, int tp) {
mf res = now;
if (tp == 1) {
res.c[4][7] = now.c[3][4];
res.c[5][7] = now.c[3][5];
res.c[6][7] = now.c[3][6];
res.c[7][6] = now.c[4][7];
res.c[7][5] = now.c[5][7];
res.c[7][4] = now.c[6][7];
res.c[4][3] = now.c[7][4];
res.c[5][3] = now.c[7][5];
res.c[6][3] = now.c[7][6];
res.c[3][4] = now.c[6][3];
res.c[3][5] = now.c[5][3];
res.c[3][6] = now.c[4][3];
} else if (tp == 2) {
res.c[3][4] = now.c[4][7];
res.c[3][5] = now.c[5][7];
res.c[3][6] = now.c[6][7];
res.c[4][7] = now.c[7][6];
res.c[5][7] = now.c[7][5];
res.c[6][7] = now.c[7][4];
res.c[7][4] = now.c[4][3];
res.c[7][5] = now.c[5][3];
res.c[7][6] = now.c[6][3];
res.c[6][3] = now.c[3][4];
res.c[5][3] = now.c[3][5];
res.c[4][3] = now.c[3][6];
} else if (tp == 3) {
for (int i = 4; i <= 12; i ++) res.c[4][i] = now.c[4][i - 3];
res.c[4][1] = now.c[4][10];
res.c[4][2] = now.c[4][11];
res.c[4][3] = now.c[4][12];
} else if (tp == 4) {
for (int i = 1; i <= 9; i ++) res.c[4][i] = now.c[4][i + 3];
res.c[4][10] = now.c[4][1];
res.c[4][11] = now.c[4][2];
res.c[4][12] = now.c[4][3];
} else if (tp == 5) {
for (int i = 4; i <= 12; i ++) res.c[6][i] = now.c[6][i - 3];
res.c[6][1] = now.c[6][10];
res.c[6][2] = now.c[6][11];
res.c[6][3] = now.c[6][12];
} else if (tp == 6) {
for (int i = 1; i <= 9; i ++) res.c[6][i] = now.c[6][i + 3];
res.c[6][10] = now.c[6][1];
res.c[6][11] = now.c[6][2];
res.c[6][12] = now.c[6][3];
} else if (tp == 7) {
res.c[4][9] = now.c[1][4];
res.c[5][9] = now.c[1][5];
res.c[6][9] = now.c[1][6];
res.c[9][6] = now.c[4][9];
res.c[9][5] = now.c[5][9];
res.c[9][4] = now.c[6][9];
res.c[4][1] = now.c[9][4];
res.c[5][1] = now.c[9][5];
res.c[6][1] = now.c[9][6];
res.c[1][4] = now.c[6][1];
res.c[1][5] = now.c[5][1];
res.c[1][6] = now.c[4][1];
} else if (tp == 8) {
res.c[1][4] = now.c[4][9];
res.c[1][5] = now.c[5][9];
res.c[1][6] = now.c[6][9];
res.c[4][9] = now.c[9][6];
res.c[5][9] = now.c[9][5];
res.c[6][9] = now.c[9][4];
res.c[9][4] = now.c[4][1];
res.c[9][5] = now.c[5][1];
res.c[9][6] = now.c[6][1];
res.c[6][1] = now.c[1][4];
res.c[5][1] = now.c[1][5];
res.c[4][1] = now.c[1][6];
} else if (tp == 9){
for (int i = 4; i <= 9; i ++) {
res.c[i][4] = now.c[i - 3][4];
}
res.c[1][4] = now.c[6][12];
res.c[2][4] = now.c[5][12];
res.c[3][4] = now.c[4][12];
res.c[6][12] = now.c[7][4];
res.c[5][12] = now.c[8][4];
res.c[4][12] = now.c[9][4];
} else if (tp == 10) {
for (int i = 4; i <= 9; i ++) {
res.c[i - 3][4] = now.c[i][4];
}
res.c[6][12] = now.c[1][4];
res.c[5][12] = now.c[2][4];
res.c[4][12] = now.c[3][4];
res.c[7][4] = now.c[6][12];
res.c[8][4] = now.c[5][12];
res.c[9][4] = now.c[4][12];
} else if (tp == 11){
for (int i = 4; i <= 9; i ++) {
res.c[i][6] = now.c[i - 3][6];
}
res.c[1][6] = now.c[6][10];
res.c[2][6] = now.c[5][10];
res.c[3][6] = now.c[4][10];
res.c[6][10] = now.c[7][6];
res.c[5][10] = now.c[8][6];
res.c[4][10] = now.c[9][6];
} else if (tp == 12) {
for (int i = 4; i <= 9; i ++) {
res.c[i - 3][6] = now.c[i][6];
}
res.c[6][10] = now.c[1][6];
res.c[5][10] = now.c[2][6];
res.c[4][10] = now.c[3][6];
res.c[7][6] = now.c[6][10];
res.c[8][6] = now.c[5][10];
res.c[9][6] = now.c[4][10];
}
return res;
}
bool flag = 0;
bool check (mf x) {
int cnt = 0;
for (int i = 1; i <= 9; i ++) {
for (int j = 1; j <= 12; j ++) {
if (x.c[i][j] != mb[i][j]) cnt ++;
}
}
if (cnt == 0) { flag = 1; return 1;}
return cnt == 2;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t --) {
flag = 0;
mf now;
for (int i = 1; i <= 9; i ++) {
now.c[i].resize(13);
for (int j = 1; j <= 12; j ++) {
cin >> now.c[i][j];
}
}
mf beg;
for (int i = 1; i <= 12; i ++) {
mf nxt = change(now, i);
if (check(nxt)) {
beg = nxt;
}
nxt.print();
cout << endl;
for (int j = 1; j <= 12; j ++) {
mf nnxt = change(nxt, j);
if (check(nnxt)) {
beg = nnxt;
}
for (int k = 1; k <= 12; k ++) {
mf nnnxt = change(nnxt, k);
if (check(nnnxt)) {
beg = nnnxt;
}
}
}
}
if (flag) {
cout << "No problem\n";
continue;
}
if (beg.c[1][4] != '1' || beg.c[4][1] != '2' || beg.c[4][12] != '5') cout << "1 2 5\n";
else if (beg.c[3][4] != '1' || beg.c[4][4] != '3' || beg.c[4][3] != '2') cout << "1 2 3\n";
else if (beg.c[3][6] != '1' || beg.c[4][6] != '3' || beg.c[4][7] != '4') cout << "1 3 4\n";
else if (beg.c[6][6] != '3' || beg.c[6][7] != '4' || beg.c[7][6] != '6') cout << "3 4 6\n";
else if (beg.c[6][3] != '2' || beg.c[7][4] != '6' || beg.c[6][4] != '3') cout << "2 3 6\n";
else if (beg.c[1][6] != '1' || beg.c[4][9] != '4' || beg.c[4][10] != '5') cout << "1 4 5\n";
else if (beg.c[6][9] != '4' || beg.c[6][10] != '5' || beg.c[9][6] != '6') cout << "4 5 6\n";
else if (beg.c[6][1] != '2' || beg.c[9][4] != '6' || beg.c[6][12] != '5') cout << "2 5 6\n";
}
return 0;
}