【题目描述】
This is a very popular game for children. In this game,there’s a cube,which consists of 3 * 3 * 3 small cubes.We can unwrap the cube,it will become like this:
这是一个孩子的非常出名的游戏。在这个游戏中,有一个立方体由3*3*3个小立方体组成。我们可以展开立方体,它会变成这个样子:
w w w
w w w
w w w
r r r g g g b b b o o o
r r r g g g b b b o o o
r r r g g g b b b o o o
y y y
y y y
y y y
The letters means the color on the small cubes.For example,‘r’ means red,‘g’ means green,‘y’ means yellow…The goal for this game is to rotate the faces of the cube to make each of the faces contains only one color.Note there’re exact 6 kind of colors on the cube and there’re exact 9 small rectangles totally in any time in the game.
字母表示每个小立方体的颜色。举个例子,‘r’表示红色,‘g’表示绿色,‘y’表示黄色……这个游戏的目标是旋转立方体的面,使每个面只包含一种颜色。注意,立方体上有确切的6种颜色,在游戏中的任何时间都有精确的9个小矩形。
Do you know how to rotate the faces?I think most of you have known it.But I would like to show it again.When a face is rotated,the configuration of colors in all the adjacent faces changes.For the cube above,after we rotate the green face clock-wise,the last line of ‘w’ face will become the left column of ‘b’ face,the left column of ‘b’ face will become the top line of ‘y’ face,etc. As you may know,reaching the final position from a scrambled configuration can be quite challenging. In this problem, you are given a configuration of the cube,and asked to give a way to reach the final position. To reduce the difficulty, the steps required will never be greater than 5.
你知道如何转动面吗?我想你们大多数人都是知道的。但是我更愿意向你再展示它一下。当一个面被旋转,所有相邻面孔的颜色配置都会发生变化。对于上面的立方体,当我们按顺时针方向旋转绿色脸后,w的最后一行将变成b面的左列,b面的左列将成为y面的顶端,等等。正如您可能知道的,从乱序到达最后位置是相当有挑战性的。在这个问题中,您将得到立方体的配置,并被要求给出到达最后位置的方法。为了减少困难,所需的步骤永远不会大于5。
【输入】
The input contains an integer in the first line,which indicates the number of the test cases. In each test case,there’re exact 10 lines.The first line is an empty line.The next 9 lines contain a configuration.The format can be seen in the sample input.For simplicity,we give an index to each face as follows:
输入的第一行包含一个整数,指测试样例的个数。在每个测试样例中,有10行,第一行是个空行,下面9行包含一个结构。格式可以在示例输入中看到。为了简单起见,我们对每个面给出如下索引:
/---\
| |
| 4 |
| |
/---+---+---+---\
| | | | |
| 0 | 1 | 2 | 3 |
| | | | |
\---+---+---+---/
| |
| 5 |
| |
\---/
Note that there’s a space between two adjacent letters.
注意有一个空格在两个相邻的字母中间。
【输出】
For each test case, the first line of the output is the smallest count N of the steps to reach the winning position. If the winning position can’t be reached in 5 steps, print -1 in this line. Otherwise print each step in one line in the following N lines. A step contains two integers, the first one means the face index, and the second one means the direction. 1 means clock-wise and -1 means counter clock-wise. If the given position is the winning position, print 0 for such test case simply. If there’re multiple solutions, any one is acceptable.
对于每个测试样例,输出的第一行是一个N表示到达胜利位置的步数,如果胜利位置不能在5步之内被到达,在这一行中输出-1。否则,就在后面N行中,每行打印一步。一步包含两个整数,第一个表示面的索引,第二个表示位置,1表示顺时针,-1表示逆时针,如果给出的位置就是胜利的位置,只要输出0就可以。如果有多个情况,输出任意一种都可以被接受。
【样例输入】
2
w w w
w w w
w w w
r r r g g g b b b o o o
r r r g g g b b b o o o
r r r g g g b b b o o o
y y y
y y y
y y y
w w w
w w w
b b b
r r w g g g y b b o o o
r r w g g g y b b o o o
r r w g g g y b b o o o
r r r
y y y
y y y
【样例输出】
0
1
1 1
题目链接:https://cn.vjudge.net/problem/ZOJ-2477
vjudge上的题干有格式问题,还是回ZOJ看比较好
大佬们都写IDA*,菜鸡我写BFS【卑微
模拟12种操作,这个时候要是手里有个魔方多好
把第6步存进队列会爆内存,所以只能在第六步进队之前return
前方高能,非战斗人员请迅速撤离
丢人代码想了想还是贴出来吧,毕竟敲了一下午。。
代码如下:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
short int T;
struct Node{
char cube[6][4][4];
short int step;
short int face[6];
short int kind[6];
Node* pre;
};
void bfs(Node node)
{
queue<Node> Q;
Q.push(node);
while(!Q.empty())
{
Node now=Q.front();
Q.pop();
bool flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(now.cube[i][j][k]==now.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<now.step<<endl;
for(short int i=1;i<=now.step;i++)
cout<<now.face[i]<<" "<<now.kind[i]<<endl;
return;
}
Node next=now;
next.step+=1;
next.face[next.step]=0;
next.kind[next.step]=-1;
next.cube[0][1][1]=now.cube[0][1][3];
next.cube[0][1][2]=now.cube[0][2][3];
next.cube[0][1][3]=now.cube[0][3][3];
next.cube[0][2][1]=now.cube[0][1][2];
next.cube[0][2][2]=now.cube[0][2][2];
next.cube[0][2][3]=now.cube[0][3][2];
next.cube[0][3][1]=now.cube[0][1][1];
next.cube[0][3][2]=now.cube[0][2][1];
next.cube[0][3][3]=now.cube[0][3][1];
next.cube[4][1][1]=now.cube[1][1][1];
next.cube[4][2][1]=now.cube[1][2][1];
next.cube[4][3][1]=now.cube[1][3][1];
next.cube[1][1][1]=now.cube[5][1][1];
next.cube[1][2][1]=now.cube[5][2][1];
next.cube[1][3][1]=now.cube[5][3][1];
next.cube[5][1][1]=now.cube[3][3][3];
next.cube[5][2][1]=now.cube[3][2][3];
next.cube[5][3][1]=now.cube[3][1][3];
next.cube[3][1][3]=now.cube[4][3][1];
next.cube[3][2][3]=now.cube[4][2][1];
next.cube[3][3][3]=now.cube[4][1][1];
if(next.step>5)
{
cout<<-1<<endl;
return;
}
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=0;
next.kind[next.step]=1;
next.cube[0][1][1]=now.cube[0][3][1];
next.cube[0][1][2]=now.cube[0][2][1];
next.cube[0][1][3]=now.cube[0][1][1];
next.cube[0][2][1]=now.cube[0][3][2];
next.cube[0][2][2]=now.cube[0][2][2];
next.cube[0][2][3]=now.cube[0][1][2];
next.cube[0][3][1]=now.cube[0][3][3];
next.cube[0][3][2]=now.cube[0][2][3];
next.cube[0][3][3]=now.cube[0][1][3];
next.cube[1][1][1]=now.cube[4][1][1];
next.cube[1][2][1]=now.cube[4][2][1];
next.cube[1][3][1]=now.cube[4][3][1];
next.cube[4][1][1]=now.cube[3][3][3];
next.cube[4][2][1]=now.cube[3][2][3];
next.cube[4][3][1]=now.cube[3][1][3];
next.cube[3][1][3]=now.cube[5][3][1];
next.cube[3][2][3]=now.cube[5][2][1];
next.cube[3][3][3]=now.cube[5][1][1];
next.cube[5][1][1]=now.cube[1][1][1];
next.cube[5][2][1]=now.cube[1][2][1];
next.cube[5][3][1]=now.cube[1][3][1];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=1;
next.kind[next.step]=-1;
next.cube[1][1][1]=now.cube[1][1][3];
next.cube[1][1][2]=now.cube[1][2][3];
next.cube[1][1][3]=now.cube[1][3][3];
next.cube[1][2][1]=now.cube[1][1][2];
next.cube[1][2][2]=now.cube[1][2][2];
next.cube[1][2][3]=now.cube[1][3][2];
next.cube[1][3][1]=now.cube[1][1][1];
next.cube[1][3][2]=now.cube[1][2][1];
next.cube[1][3][3]=now.cube[1][3][1];
next.cube[0][1][3]=now.cube[4][3][3];
next.cube[0][2][3]=now.cube[4][3][2];
next.cube[0][3][3]=now.cube[4][3][1];
next.cube[4][3][1]=now.cube[2][1][1];
next.cube[4][3][2]=now.cube[2][2][1];
next.cube[4][3][3]=now.cube[2][3][1];
next.cube[2][1][1]=now.cube[5][1][3];
next.cube[2][2][1]=now.cube[5][1][2];
next.cube[2][3][1]=now.cube[5][1][1];
next.cube[5][1][1]=now.cube[0][1][3];
next.cube[5][1][2]=now.cube[0][2][3];
next.cube[5][1][3]=now.cube[0][3][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=1;
next.kind[next.step]=1;
next.cube[1][1][1]=now.cube[1][3][1];
next.cube[1][1][2]=now.cube[1][2][1];
next.cube[1][1][3]=now.cube[1][1][1];
next.cube[1][2][1]=now.cube[1][3][2];
next.cube[1][2][2]=now.cube[1][2][2];
next.cube[1][2][3]=now.cube[1][1][2];
next.cube[1][3][1]=now.cube[1][3][3];
next.cube[1][3][2]=now.cube[1][2][3];
next.cube[1][3][3]=now.cube[1][1][3];
next.cube[4][3][1]=now.cube[0][3][3];
next.cube[4][3][2]=now.cube[0][2][3];
next.cube[4][3][3]=now.cube[0][1][3];
next.cube[2][1][1]=now.cube[4][3][1];
next.cube[2][2][1]=now.cube[4][3][2];
next.cube[2][3][1]=now.cube[4][3][3];
next.cube[5][1][1]=now.cube[2][3][1];
next.cube[5][1][2]=now.cube[2][2][1];
next.cube[5][1][3]=now.cube[2][1][1];
next.cube[0][1][3]=now.cube[5][1][1];
next.cube[0][2][3]=now.cube[5][1][2];
next.cube[0][3][3]=now.cube[5][1][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=2;
next.kind[next.step]=-1;
next.cube[2][1][1]=now.cube[2][1][3];
next.cube[2][1][2]=now.cube[2][2][3];
next.cube[2][1][3]=now.cube[2][3][3];
next.cube[2][2][1]=now.cube[2][1][2];
next.cube[2][2][2]=now.cube[2][2][2];
next.cube[2][2][3]=now.cube[2][3][2];
next.cube[2][3][1]=now.cube[2][1][1];
next.cube[2][3][2]=now.cube[2][2][1];
next.cube[2][3][3]=now.cube[2][3][1];
next.cube[1][1][3]=now.cube[4][1][3];
next.cube[1][2][3]=now.cube[4][2][3];
next.cube[1][3][3]=now.cube[4][3][3];
next.cube[4][1][3]=now.cube[3][3][1];
next.cube[4][2][3]=now.cube[3][2][1];
next.cube[4][3][3]=now.cube[3][1][1];
next.cube[3][1][1]=now.cube[5][3][3];
next.cube[3][2][1]=now.cube[5][2][3];
next.cube[3][3][1]=now.cube[5][1][3];
next.cube[5][1][3]=now.cube[1][1][3];
next.cube[5][2][3]=now.cube[1][2][3];
next.cube[5][3][3]=now.cube[1][3][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=2;
next.kind[next.step]=1;
next.cube[2][1][1]=now.cube[2][3][1];
next.cube[2][1][2]=now.cube[2][2][1];
next.cube[2][1][3]=now.cube[2][1][1];
next.cube[2][2][1]=now.cube[2][3][2];
next.cube[2][2][2]=now.cube[2][2][2];
next.cube[2][2][3]=now.cube[2][1][2];
next.cube[2][3][1]=now.cube[2][3][3];
next.cube[2][3][2]=now.cube[2][2][3];
next.cube[2][3][3]=now.cube[2][1][3];
next.cube[4][1][3]=now.cube[1][1][3];
next.cube[4][2][3]=now.cube[1][2][3];
next.cube[4][3][3]=now.cube[1][3][3];
next.cube[3][1][1]=now.cube[4][3][3];
next.cube[3][2][1]=now.cube[4][2][3];
next.cube[3][3][1]=now.cube[4][1][3];
next.cube[5][1][3]=now.cube[3][3][1];
next.cube[5][2][3]=now.cube[3][2][1];
next.cube[5][3][3]=now.cube[3][1][1];
next.cube[1][1][3]=now.cube[5][1][3];
next.cube[1][2][3]=now.cube[5][2][3];
next.cube[1][3][3]=now.cube[5][3][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=3;
next.kind[next.step]=-1;
next.cube[3][1][1]=now.cube[3][1][3];
next.cube[3][1][2]=now.cube[3][2][3];
next.cube[3][1][3]=now.cube[3][3][3];
next.cube[3][2][1]=now.cube[3][1][2];
next.cube[3][2][2]=now.cube[3][2][2];
next.cube[3][2][3]=now.cube[3][3][2];
next.cube[3][3][1]=now.cube[3][1][1];
next.cube[3][3][2]=now.cube[3][2][1];
next.cube[3][3][3]=now.cube[3][3][1];
next.cube[2][1][3]=now.cube[4][1][1];
next.cube[2][2][3]=now.cube[4][1][2];
next.cube[2][3][3]=now.cube[4][1][3];
next.cube[4][1][1]=now.cube[0][3][1];
next.cube[4][1][2]=now.cube[0][2][1];
next.cube[4][1][3]=now.cube[0][1][1];
next.cube[0][1][1]=now.cube[5][3][1];
next.cube[0][2][1]=now.cube[5][3][2];
next.cube[0][3][1]=now.cube[5][3][3];
next.cube[5][3][1]=now.cube[2][3][3];
next.cube[5][3][2]=now.cube[2][2][3];
next.cube[5][3][3]=now.cube[2][1][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=3;
next.kind[next.step]=1;
next.cube[3][1][1]=now.cube[3][3][1];
next.cube[3][1][2]=now.cube[3][2][1];
next.cube[3][1][3]=now.cube[3][1][1];
next.cube[3][2][1]=now.cube[3][3][2];
next.cube[3][2][2]=now.cube[3][2][2];
next.cube[3][2][3]=now.cube[3][1][2];
next.cube[3][3][1]=now.cube[3][3][3];
next.cube[3][3][2]=now.cube[3][2][3];
next.cube[3][3][3]=now.cube[3][1][3];
next.cube[4][1][1]=now.cube[2][1][3];
next.cube[4][1][2]=now.cube[2][2][3];
next.cube[4][1][3]=now.cube[2][3][3];
next.cube[2][1][3]=now.cube[5][3][3];
next.cube[2][2][3]=now.cube[5][3][2];
next.cube[2][3][3]=now.cube[5][3][1];
next.cube[5][3][1]=now.cube[0][1][1];
next.cube[5][3][2]=now.cube[0][2][1];
next.cube[5][3][3]=now.cube[0][3][1];
next.cube[0][1][1]=now.cube[4][1][3];
next.cube[0][2][1]=now.cube[4][1][2];
next.cube[0][3][1]=now.cube[4][1][1];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=4;
next.kind[next.step]=-1;
next.cube[4][1][1]=now.cube[4][1][3];
next.cube[4][1][2]=now.cube[4][2][3];
next.cube[4][1][3]=now.cube[4][3][3];
next.cube[4][2][1]=now.cube[4][1][2];
next.cube[4][2][2]=now.cube[4][2][2];
next.cube[4][2][3]=now.cube[4][3][2];
next.cube[4][3][1]=now.cube[4][1][1];
next.cube[4][3][2]=now.cube[4][2][1];
next.cube[4][3][3]=now.cube[4][3][1];
next.cube[0][1][1]=now.cube[3][1][1];
next.cube[0][1][2]=now.cube[3][1][2];
next.cube[0][1][3]=now.cube[3][1][3];
next.cube[3][1][1]=now.cube[2][1][1];
next.cube[3][1][2]=now.cube[2][1][2];
next.cube[3][1][3]=now.cube[2][1][3];
next.cube[2][1][1]=now.cube[1][1][1];
next.cube[2][1][2]=now.cube[1][1][2];
next.cube[2][1][3]=now.cube[1][1][3];
next.cube[1][1][1]=now.cube[0][1][1];
next.cube[1][1][2]=now.cube[0][1][2];
next.cube[1][1][3]=now.cube[0][1][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=4;
next.kind[next.step]=1;
next.cube[4][1][1]=now.cube[4][3][1];
next.cube[4][1][2]=now.cube[4][2][1];
next.cube[4][1][3]=now.cube[4][1][1];
next.cube[4][2][1]=now.cube[4][3][2];
next.cube[4][2][2]=now.cube[4][2][2];
next.cube[4][2][3]=now.cube[4][1][2];
next.cube[4][3][1]=now.cube[4][3][3];
next.cube[4][3][2]=now.cube[4][2][3];
next.cube[4][3][3]=now.cube[4][1][3];
next.cube[3][1][1]=now.cube[0][1][1];
next.cube[3][1][2]=now.cube[0][1][2];
next.cube[3][1][3]=now.cube[0][1][3];
next.cube[2][1][1]=now.cube[3][1][1];
next.cube[2][1][2]=now.cube[3][1][2];
next.cube[2][1][3]=now.cube[3][1][3];
next.cube[1][1][1]=now.cube[2][1][1];
next.cube[1][1][2]=now.cube[2][1][2];
next.cube[1][1][3]=now.cube[2][1][3];
next.cube[0][1][1]=now.cube[1][1][1];
next.cube[0][1][2]=now.cube[1][1][2];
next.cube[0][1][3]=now.cube[1][1][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=5;
next.kind[next.step]=-1;
next.cube[5][1][1]=now.cube[5][1][3];
next.cube[5][1][2]=now.cube[5][2][3];
next.cube[5][1][3]=now.cube[5][3][3];
next.cube[5][2][1]=now.cube[5][1][2];
next.cube[5][2][2]=now.cube[5][2][2];
next.cube[5][2][3]=now.cube[5][3][2];
next.cube[5][3][1]=now.cube[5][1][1];
next.cube[5][3][2]=now.cube[5][2][1];
next.cube[5][3][3]=now.cube[5][3][1];
next.cube[3][3][1]=now.cube[0][3][1];
next.cube[3][3][2]=now.cube[0][3][2];
next.cube[3][3][3]=now.cube[0][3][3];
next.cube[2][3][1]=now.cube[3][3][1];
next.cube[2][3][2]=now.cube[3][3][2];
next.cube[2][3][3]=now.cube[3][3][3];
next.cube[1][3][1]=now.cube[2][3][1];
next.cube[1][3][2]=now.cube[2][3][2];
next.cube[1][3][3]=now.cube[2][3][3];
next.cube[0][3][1]=now.cube[1][3][1];
next.cube[0][3][2]=now.cube[1][3][2];
next.cube[0][3][3]=now.cube[1][3][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
next=now;
next.step+=1;
next.face[next.step]=5;
next.kind[next.step]=1;
next.cube[5][1][1]=now.cube[5][3][1];
next.cube[5][1][2]=now.cube[5][2][1];
next.cube[5][1][3]=now.cube[5][1][1];
next.cube[5][2][1]=now.cube[5][3][2];
next.cube[5][2][2]=now.cube[5][2][2];
next.cube[5][2][3]=now.cube[5][1][2];
next.cube[5][3][1]=now.cube[5][3][3];
next.cube[5][3][2]=now.cube[5][2][3];
next.cube[5][3][3]=now.cube[5][1][3];
next.cube[0][3][1]=now.cube[3][3][1];
next.cube[0][3][2]=now.cube[3][3][2];
next.cube[0][3][3]=now.cube[3][3][3];
next.cube[3][3][1]=now.cube[2][3][1];
next.cube[3][3][2]=now.cube[2][3][2];
next.cube[3][3][3]=now.cube[2][3][3];
next.cube[2][3][1]=now.cube[1][3][1];
next.cube[2][3][2]=now.cube[1][3][2];
next.cube[2][3][3]=now.cube[1][3][3];
next.cube[1][3][1]=now.cube[0][3][1];
next.cube[1][3][2]=now.cube[0][3][2];
next.cube[1][3][3]=now.cube[0][3][3];
flag=true;
for(short int i=0;i<6;i++)
{
if(flag)
for(short int j=1;j<=3;j++)
if(flag)
for(short int k=1;k<=3;k++)
if(next.cube[i][j][k]==next.cube[i][2][2])
continue;
else
{
flag=false;
break;
}
else
break;
else
break;
}
if(flag)
{
cout<<next.step<<endl;
for(short int i=1;i<=next.step;i++)
cout<<next.face[i]<<" "<<next.kind[i]<<endl;
return;
}
Q.push(next);
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0),cout.tie(0);
cin>>T;
while(T--)
{
Node pre;
for(short int i=1;i<=3;i++)
for(short int j=1;j<=3;j++)
cin>>pre.cube[4][i][j];
for(short int i=1;i<=3;i++)
{
for(short int j=1;j<=3;j++)
cin>>pre.cube[0][i][j];
for(short int j=1;j<=3;j++)
cin>>pre.cube[1][i][j];
for(short int j=1;j<=3;j++)
cin>>pre.cube[2][i][j];
for(short int j=1;j<=3;j++)
cin>>pre.cube[3][i][j];
}
for(short int i=1;i<=3;i++)
for(short int j=1;j<=3;j++)
cin>>pre.cube[5][i][j];
pre.step=0;
memset(pre.face,0,sizeof(pre.face));
memset(pre.kind,0,sizeof(pre.kind));
pre.pre=NULL;
bfs(pre);
}
return 0;
}