30年前流行的儿童拼图由一个5×5的框架组成,其中包含24个
相同大小的小方块。每个小广场上都印有一个独特的字母。由于
框架内只有24个正方形,因此框架还包含一个与
小正方形大小相同的空位置。如果正方形位于空位置的
右侧,左侧,上方或下方,则可以将方形移动到该空位置。拼图的目的是将方块滑动
到空位置,以便框架按字母顺序显示字母。
下图显示了原始配置中的一个谜题,以及在
以下6个移动序列之后的配置:
1)空位置上方的方块移动。
2)空位右侧的方格移动。
3)空位右侧的方格移动。
4)空位下方的方块移动。
5)空位下方的方块移动。
6)空位左侧的方格移动。
根据初始配置和移动顺序编写程序以显示结果帧。您的程序的
输入
输入包含几个谜题。每个都由它的初始配置和
拼图上的移动顺序来描述。每个拼图描述的前5行是起始
配置。后续行给出了移动序列。
框架显示的第一行对应于拼图中的顶部正方形线。其他
行按顺序排列。框架中的空位置由空白表示。每个显示行包含
5个字符,从最左边的正方形上的字符开始(如果最左边的话,则为空白)
square实际上是空框架位置)。显示行将对应于合法的拼图。
移动序列由As,Bs,Rs和Ls的序列表示,以表示哪个方块
移动到空位置。A表示空位置上方的方格移动; B表示
空位下方的平方移动; L表示空位左边的方格
移动; R表示空位置右侧的平方移动。
即使由4个移动字符中的一个表示,也可能存在非法移动。如果发生非法移动
,则认为该谜题没有最终配置。可以传播这一系列的动作
在几行中,它总是以数字0结束。数据的结尾用字符Z表示。每个拼图的
输出
输出以适当标记的数字开始(拼图#1,拼图#2等)。如果
拼图没有最终配置,那么应该遵循相应的消息。否则
应显示最终配置。
格式化每一行以进行最终配置,以便在两个
相邻字母之间存在单个空白字符。将空方块视为字母。例如,如果空白是一个内部
位置,那么它将显示为一个3个空白的序列 - 一个用于将它与正方形分开到左边,
一个用于空位置本身,一个用于将其与正方形分隔为对。
通过一个空行将不同拼图记录的输出分开。
注意:示例输入的第一条记录对应于上面说明的拼图。
样本输入
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z
样本输出
拼图#1:
TRGSJ
XOKLI
MDVBN
WPAE
UQHCF
拼图#2:
ABCD
FGHIE
KLMNJ
PQRSO
TUVWX
拼图#3:
这个拼图没有最终配置。
#include<stdio.h>
#include<string.h>
#include<iostream>
#define maxn 5
const int dir[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
const char s[] ="ABRL";
using namespace std;
int main()
{
char a[maxn][maxn];
int count=0;
while(gets(a[0]))
{
int x=0,y=0;
if(a[0][0]=='Z')
break;
if(count)
{
cout<<endl;
}
for(int i=1;i<maxn;i++)
{
gets(a[i]);
}
for(int i=0;i<maxn;i++)
{
for(int j=0;j<maxn;j++)
{
// a[i][j]=getchar();
if(a[i][j]==' '||a[i][j]=='\0')
{
a[i][j]=' ';
x=i;
y=j;
}
}
}
bool bo = true;
for(;;)
{
char c=getchar();
if(c=='0')
{
break;
}
bool q = isspace(c);
for(int i=0;i<4&&bo;i++)
{
if(c==s[i])
{
q=true;
//int m=x,n=y;
int m=x+dir[i][0];
int n=y+dir[i][1];
if(x<0||x>4||y<0||y>4)
{
bo=false;
break;
}
a[x][y]=a[m][n];
a[m][n]=' ';
x=m;
y=n;
}
}
if(!q)
{
bo = false;
}
}
printf("Puzzle #%d\n",++count);
if(bo)
{
for(int i=0;i<maxn;i++)
{
for(int j=0;j<maxn;j++)
{
if(j)
{
cout<<" ";
}
cout<<a[i][j];
}
cout<<endl;
}
}
else
{
cout<<"This puzzle has no final configuration."<<endl;
}
}
return 0;
}