题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2477
从接触acm到现在,一直很抵触ZOJ的题目,我做过的很多ZOJ的题目大部分题意都很模糊,阐述不清楚。
这道题的难点不在搜索,光看题目的问法都应该知道是用迭代加深,但是真正让人崩溃的是什么地方?
首先是立方的展开图,如果没指名哪一面是正面或者背面,对应的顺逆时针方向也会不同,题目没说明怎么办?能咋办,我只有去试啊,我最先是以索引为1的这一面为立方的背面,然后模拟顺逆时针的旋转,一直WA,而且还不敢肯定WA的原因是顺逆时针还是其他地方没写好,当我以索引为1的这一面为正面的时候,重新修改模拟顺逆时针的代码,就AC了。真的无话可说。
#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int Maxn = 4e5+10;
int cube[10][4][4];
bool check() {
for(int i = 0; i < 6; ++i) {
int tmp = cube[i][0][0];
for(int j = 0; j < 3; ++j) {
for(int k = 0; k < 3; ++k) if(tmp != cube[i][j][k]) {
return false;
}
}
}
return true;
}
void Size(int x, int dir) {
if(dir == 1) {
swap(cube[x][0][0], cube[x][0][2]);
swap(cube[x][0][0], cube[x][2][2]);
swap(cube[x][0][0], cube[x][2][0]);
swap(cube[x][0][1], cube[x][1][2]);
swap(cube[x][0][1], cube[x][2][1]);
swap(cube[x][0][1], cube[x][1][0]);
} else {
swap(cube[x][0][0], cube[x][2][0]);
swap(cube[x][0][0], cube[x][2][2]);
swap(cube[x][0][0], cube[x][0][2]);
swap(cube[x][0][1], cube[x][1][0]);
swap(cube[x][0][1], cube[x][2][1]);
swap(cube[x][0][1], cube[x][1][2]);
}
}
void solve(int x, int dir) {
Size(x, dir);
if(x == 1 && dir == 1) { //
swap(cube[4][2][0], cube[2][0][0]); swap(cube[4][2][2], cube[2][2][0]);
swap(cube[4][2][0], cube[5][0][2]); swap(cube[4][2][2], cube[5][0][0]);
swap(cube[4][2][0], cube[0][2][2]); swap(cube[4][2][2], cube[0][0][2]);
swap(cube[4][2][1], cube[2][1][0]);
swap(cube[4][2][1], cube[5][0][1]);
swap(cube[4][2][1], cube[0][1][2]);
} else if(x == 1 && dir == -1) {
swap(cube[4][2][0], cube[0][2][2]); swap(cube[4][2][2], cube[0][0][2]);
swap(cube[4][2][0], cube[5][0][2]); swap(cube[4][2][2], cube[5][0][0]);
swap(cube[4][2][0], cube[2][0][0]); swap(cube[4][2][2], cube[2][2][0]);
swap(cube[4][2][1], cube[0][1][2]);
swap(cube[4][2][1], cube[5][0][1]);
swap(cube[4][2][1], cube[2][1][0]);
}
if(x == 3 && dir == -1) { //
swap(cube[4][0][0], cube[2][0][2]); swap(cube[4][0][2], cube[2][2][2]);
swap(cube[4][0][0], cube[5][2][2]); swap(cube[4][0][2], cube[5][2][0]);
swap(cube[4][0][0], cube[0][2][0]); swap(cube[4][0][2], cube[0][0][0]);
swap(cube[4][0][1], cube[2][1][2]);
swap(cube[4][0][1], cube[5][2][1]);
swap(cube[4][0][1], cube[0][1][0]);
} else if(x == 3 && dir == 1) {
swap(cube[4][0][0], cube[0][2][0]); swap(cube[4][0][2], cube[0][0][0]);
swap(cube[4][0][0], cube[5][2][2]); swap(cube[4][0][2], cube[5][2][0]);
swap(cube[4][0][0], cube[2][0][2]); swap(cube[4][0][2], cube[2][2][2]);
swap(cube[4][0][1], cube[0][1][0]);
swap(cube[4][0][1], cube[5][2][1]);
swap(cube[4][0][1], cube[2][1][2]);
}
if(x == 2 && dir == -1) { //
swap(cube[3][0][0], cube[4][2][2]); swap(cube[3][2][0], cube[4][0][2]);
swap(cube[3][0][0], cube[1][2][2]); swap(cube[3][2][0], cube[1][0][2]);
swap(cube[3][0][0], cube[5][2][2]); swap(cube[3][2][0], cube[5][0][2]);
swap(cube[3][1][0], cube[4][1][2]);
swap(cube[3][1][0], cube[1][1][2]);
swap(cube[3][1][0], cube[5][1][2]);
} else if(x == 2 && dir == 1) {
swap(cube[3][0][0], cube[5][2][2]); swap(cube[3][2][0], cube[5][0][2]);
swap(cube[3][0][0], cube[1][2][2]); swap(cube[3][2][0], cube[1][0][2]);
swap(cube[3][0][0], cube[4][2][2]); swap(cube[3][2][0], cube[4][0][2]);
swap(cube[3][1][0], cube[5][1][2]);
swap(cube[3][1][0], cube[1][1][2]);
swap(cube[3][1][0], cube[4][1][2]);
}
if(x == 0 && dir == 1) { //
swap(cube[3][0][2], cube[4][2][0]); swap(cube[3][2][2], cube[4][0][0]);
swap(cube[3][0][2], cube[1][2][0]); swap(cube[3][2][2], cube[1][0][0]);
swap(cube[3][0][2], cube[5][2][0]); swap(cube[3][2][2], cube[5][0][0]);
swap(cube[3][1][2], cube[4][1][0]);
swap(cube[3][1][2], cube[1][1][0]);
swap(cube[3][1][2], cube[5][1][0]);
} else if(x == 0 && dir == -1) {
swap(cube[3][0][2], cube[5][2][0]); swap(cube[3][2][2], cube[5][0][0]);
swap(cube[3][0][2], cube[1][2][0]); swap(cube[3][2][2], cube[1][0][0]);
swap(cube[3][0][2], cube[4][2][0]); swap(cube[3][2][2], cube[4][0][0]);
swap(cube[3][1][2], cube[5][1][0]);
swap(cube[3][1][2], cube[1][1][0]);
swap(cube[3][1][2], cube[4][1][0]);
}
if(x == 5 && dir == -1) { //
swap(cube[3][2][0], cube[2][2][0]); swap(cube[3][2][2], cube[2][2][2]);
swap(cube[3][2][0], cube[1][2][0]); swap(cube[3][2][2], cube[1][2][2]);
swap(cube[3][2][0], cube[0][2][0]); swap(cube[3][2][2], cube[0][2][2]);
swap(cube[3][2][1], cube[2][2][1]);
swap(cube[3][2][1], cube[1][2][1]);
swap(cube[3][2][1], cube[0][2][1]);
} else if(x == 5 && dir == 1) {
swap(cube[3][2][0], cube[0][2][0]); swap(cube[3][2][2], cube[0][2][2]);
swap(cube[3][2][0], cube[1][2][0]); swap(cube[3][2][2], cube[1][2][2]);
swap(cube[3][2][0], cube[2][2][0]); swap(cube[3][2][2], cube[2][2][2]);
swap(cube[3][2][1], cube[0][2][1]);
swap(cube[3][2][1], cube[1][2][1]);
swap(cube[3][2][1], cube[2][2][1]);
}
if(x == 4 && dir == -1) { //
swap(cube[0][0][0], cube[1][0][0]); swap(cube[0][0][2], cube[1][0][2]);
swap(cube[0][0][0], cube[2][0][0]); swap(cube[0][0][2], cube[2][0][2]);
swap(cube[0][0][0], cube[3][0][0]); swap(cube[0][0][2], cube[3][0][2]);
swap(cube[0][0][1], cube[1][0][1]);
swap(cube[0][0][1], cube[2][0][1]);
swap(cube[0][0][1], cube[3][0][1]);
} else if(x == 4 && dir == 1) {
swap(cube[0][0][0], cube[3][0][0]); swap(cube[0][0][2], cube[3][0][2]);
swap(cube[0][0][0], cube[2][0][0]); swap(cube[0][0][2], cube[2][0][2]);
swap(cube[0][0][0], cube[1][0][0]); swap(cube[0][0][2], cube[1][0][2]);
swap(cube[0][0][1], cube[3][0][1]);
swap(cube[0][0][1], cube[2][0][1]);
swap(cube[0][0][1], cube[1][0][1]);
}
}
int ans[10][2], cnt;
void print() {
for(int i = 0; i < 6; ++i) {
for(int j = 0; j < 3; ++j) {
for(int k = 0; k < 3; ++k) cout << cube[i][j][k] << " ";
cout << endl;
}
cout << endl;
}
}
bool dfs(int dep, int step) {
if(check()) return true;
if(step == dep) return false;
for(int i = 0; i < 6; ++i) {
ans[cnt][0] = i; ans[cnt][1] = -1;
cnt++; solve(i, -1);
if(dfs(dep, step+1)) return true;
cnt--; solve(i, 1);
ans[cnt][0] = i; ans[cnt][1] = 1;
cnt++; solve(i, 1);
if(dfs(dep, step+1)) return true;
cnt--; solve(i, -1);
}
return false;
}
int main(void)
{
int T;
scanf("%d", &T);
while(T--) {
int r = 0, c = 0;
while(r < 2 || c < 3) {
char ch = getchar();
if(c == 3) {
c = 0; r++;
}
if(ch >= 'a' && ch <= 'z') cube[4][r][c++] = ch-'a';
}
r = 0; c = 0;
while(r < 2 || c < 12) {
char ch = getchar();
if(c == 12) {
c = 0; r++;
}
if(ch < 'a' || ch > 'z') continue;
if(c < 3) cube[0][r][c] = ch-'a';
else if(c < 6) cube[1][r][c-3] = ch-'a';
else if(c < 9) cube[2][r][c-6] = ch-'a';
else cube[3][r][c-9] = ch-'a';
c++;
}
r = 0; c = 0;
while(r < 2 || c < 3) {
char ch = getchar();
if(c == 3) {
c = 0; r++;
}
if(ch >= 'a' && ch <= 'z') cube[5][r][c++] = ch-'a';
}
// print();
cnt = 0; bool ok = false;
for(int dep = 1; dep <= 5; ++dep) {
if(dfs(dep, 0)) {
ok = true; break;
}
}
if(!ok) printf("-1\n");
else {
printf("%d\n", cnt);
for(int i = 0; i < cnt; ++i) printf("%d %d\n", ans[i][0], ans[i][1]);
}
}
return 0;
}