#include <iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char puzzle[5][5];
char buf[10];
char order[1001];
int cnt=0;
int main()
{
while(1)
{
memset(puzzle,' ',sizeof(puzzle));
int blankx,blanky;//记录空格所在的位置
cnt+=1;//记录轮次
bool flag=true;
fgets(buf,10,stdin);//该问题输入的要求是读取前5个字符,包括空格
//所以scanf不可用,getchar可以用但是要需要正确处理回车
//fgets用来读取完整的一行,一旦读取到回车符即停止而且能够利用maxn
if(buf[0]=='Z')//当读入的第一行的第一个字符是'Z'时跳出循环
break;
for(int i=0;i<5;i++)
puzzle[0][i]=buf[i];
if(cnt!=1)
printf("\n");
//为上一轮操作补上一个回车,读到字符'Z'时该句不输出达到题目的输出格式的要求
for(int i=1;i<5;i++)
{
fgets(puzzle[i],10,stdin);
}
for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
if(puzzle[i][j]==' ')
{
blankx=i;
blanky=j;
}
}
char c;
//利用getchar一直读,直到读到'0'为止
while((c=getchar())!='0')
{
if(c=='A'&&blankx-1>=0)
{
swap(puzzle[blankx][blanky],puzzle[blankx-1][blanky]);
blankx-=1;
}else if(c=='B'&&blankx+1<=4)
{
swap(puzzle[blankx][blanky],puzzle[blankx+1][blanky]);
blankx+=1;
}else if(c=='L'&&blanky-1>=0)
{
swap(puzzle[blankx][blanky],puzzle[blankx][blanky-1]);
blanky-=1;
}else if(c=='R'&&blanky+1<=4)
{
swap(puzzle[blankx][blanky],puzzle[blankx][blanky+1]);
blanky+=1;
}else if(c!='\n'){flag=false;}
}
getchar();//处理'0'字符后面的回车
printf("Puzzle #%d:\n",cnt);
if(flag)
{
for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
{
printf("%c",puzzle[i][j]);
if(j!=4)
printf(" ");
}
if(i!=4)
printf("\n");
}
}
else{printf("This puzzle has no final configuration.");}
}
return 0;
}