#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
int main(void)
{
char c=0;//记录是否读取到了Z,表示结束
scanf("%c",&c);
char frame[5][5];
int ei=-1,ej=-1;//记录空格的下标
int count=1;//记录当前处理的是第几组数据
while('Z'!=c)
{
//读入输入的网格数据
memset(frame,0,sizeof(frame));//将数组清零
frame[0][0]=c;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(0==i&&0==j);//因为第一个位置已经被赋值,所以跳过
else
scanf("%c",&frame[i][j]);
if(frame[i][j]==' ')//判断是否是空格
ei=i,ej=j;
}
scanf("%*c");//清除每行后面的'\n'
}
//读入指令序列,以0结尾
string buf,cmd="";
cin>>buf;
cmd=buf;
while('0'!=buf[buf.size()-1])
{
buf.clear();
cin>>buf;
cmd=cmd+buf;
}
//用指令控制网格
int length=cmd.size();
int flag=1;//表示指令的正确性,1表示正确
for(int i=0;i<length-1;i++)
{
switch(cmd[i])
{
case 'A':
if(0==ei)
flag=0;
else
{
frame[ei][ej]=frame[ei-1][ej];
ei-=1;
frame[ei][ej]=' ';
}
break;
case 'B':
if(4==ei)
flag=0;
else
{
frame[ei][ej]=frame[ei+1][ej];
ei+=1;
frame[ei][ej]=' ';
}
break;
case 'R':
if(4==ej)
flag=0;
else
{
frame[ei][ej]=frame[ei][ej+1];
ej+=1;
frame[ei][ej]=' ';
}
break;
case 'L':
if(0==ej)
flag=0;
else
{
frame[ei][ej]=frame[ei][ej-1];
ej-=1;
frame[ei][ej]=' ';
}
break;
default:
break;
}
}
scanf("%*c%c",&c);//cin遇到空格停止输入,所以这里要清除cin>>cmd时的换行符
//输出整理后的网格数据
cout<<"Puzzle #"<<count<<":"<<endl;
count++;
if(1==flag)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
cout<<frame[i][j]<<" ";
cout<<frame[i][4]<<endl;
}
if('Z'!=c)
cout<<endl;
}
else
{
cout<<"This puzzle has no final configuration."<<endl;
if('Z'!=c)
cout<<endl;
}
}
return 0;
}