习题3-5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

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;

}

猜你喜欢

转载自blog.csdn.net/qq_40099908/article/details/81628048