/*双向bfs 偷懒 用map判重,没有用hash函数。
*/
#include<cstdio>
#include<cstring>#include<map>
#include<string>
using namespace std;
map<string,int> vis;
map<string,int> visn;
char final[30]= {"034305650121078709T90121"},start[30];
struct S
{
char s[30];
int step;
int path;
int pr;
} a[110000],b[110000];
int change(int p,char *s)
{
char t[30];
strcpy(t,s);
if(p==1)
{
char x=s[10],y=s[11],z=s[9];
for(int i = 2; i < 12; i++)
{
s[i] = t[i-2];
}
s[0] = x;
s[1] = y;
s[21] = s[9];
s[22] = s[10];
s[23] = s[11];
}
else if(p==2)
{
char x = s[12],y=s[13];
for(int i = 12; i < 22; i++)
s[i] = t[i+2];
s[22] = x;
s[23] = y;
s[9] = s[21];
s[10] = s[22];
s[11] = s[23];
}
else if(p==3)
{
char x = s[0],y = s[1];
for(int i = 0; i < 10; i++)
s[i] = t[i+2];
s[10] = x;
s[11] = y;
s[21] = s[9];
s[22] = s[10];
s[23] = s[11];
}
else if(p==4)
{
char x = s[22],y = s[23];
for(int i = 14; i < 24; i++)
s[i] = t[i-2];
s[12] = x;
s[13] = y;
s[9] = s[21];
s[10] = s[22];
s[11] = s[23];
}
}
int print1(int u)
{
int v;
if(u)
{
v = b[u].pr;
if(v)
{
print1(v);
}
printf("%d",b[u].path);
}
}
int print2(int u)
{
if(u)
{
int v;
v = a[u].pr;
printf("%d",a[u].path);
if(v)
print2(v);
}
}
int bfs_n()
{
memset(a,0,sizeof(a));
int front = 0,rear = 1;
a[0].step = 0;
a[0].pr = -1;
visn.clear();
visn[final]=1;
strcpy(a[0].s,final);
while(front<rear)
{
if(a[front].step>8)
{
return 0;
}
for(int i = 1; i <= 4; i++)
{
char temp[30];
strcpy(temp,a[front].s);
change(i,temp);
if(!visn[temp])
{
visn[temp] = rear;
if(i==1)
a[rear].path=3;
else if(i==3)
a[rear].path=1;
else if(i==2)
a[rear].path=4;
else if(i==4)
a[rear].path=2;
a[rear].pr = front;
a[rear].step = a[front].step+1;
strcpy(a[rear].s,temp);
rear++;
}
}
front++;
}
return 0;
}
int bfs()
{
vis.clear();
memset(b,0,sizeof(b));
int front = 0,rear = 1;
b[0].step = 0;
b[0].pr = -1;
vis[start] = 1;
strcpy(b[0].s,start);
while(front<rear)
{
if(b[front].step>8)
{
printf("NO SOLUTION WAS FOUND IN 16 STEPS\n");
return 0;
}
if(!strcmp(final,b[front].s))
{
print1(front);
printf("\n");
return 0;
}
if(visn[b[front].s])
{
print1(front);
print2(visn[b[front].s]);
printf("\n");
return 0;
}
for(int i = 1; i <= 4; i++)
{
char temp[30];
strcpy(temp,b[front].s);
change(i,temp);
if(!vis[temp])
{
vis[temp] = 1;
b[rear].step = b[front].step+1;
b[rear].path = i;
b[rear].pr = front;
strcpy(b[rear].s,temp);
rear++;
}
}
front++;
}
return 0;
}
int main()
{
int t,c;
bfs_n();
scanf("%d",&t);
while(t--)
{
for(int i = 0; i < 24; i++)
{
scanf("%d",&c);
if(c==10)
start[i] = 'T';
else start[i] = c+'0';
}
if(!strcmp(start,final))
printf("PUZZLE ALREADY SOLVED\n");
else
{
bfs();
memset(b,0,sizeof(b));
}
}
return 0;
}