谜题(UVa227)

谜题(UVa227)

1.问题简述

有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”

样例

输入:
TRGSJ
XDOKI
M__VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS__
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS__
TUVWX
AAAAABBRRRLL0
Z

输出:
Puzzle #1:
T R G S J
X O K L I
M D V B N
W P _ A E
U Q H C F

Puzzle #2:
_ A B C D
F G H I E
K L M N J
P Q R S O
T U V W X

Puzzle #3:
This puzzle has no final configuration.

2.代码展示

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 20     //定义指令最大长度
using namespace std;
int main()
{
    char s[5][5];
    char c[maxn];
    scanf("%s",c);
    getchar();  //注意吃掉回车符
    int x,y,flag=1;
    char temp;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            scanf("%c",&s[i][j]);
            if(s[i][j]==' ')    {x=i;y=j;}   //x,y记录空格的坐标
        }
        getchar();
    }
    for(int i=0;i<strlen(c);i++)
    {
        switch(c[i])
        {
            case 'A': {temp=s[x-1][y];s[x-1][y]=s[x][y];s[x][y]=temp; x=x-1;}
                break;  //将空格的位置交换,x,y位置变化
            case 'B': {temp=s[x+1][y];s[x+1][y]=s[x][y];s[x][y]=temp; x=x+1;}
                break;
            case 'L': {temp=s[x][y-1];s[x][y-1]=s[x][y];s[x][y]=temp; y=y-1;}
                break;
            case 'R': {temp=s[x][y+1];s[x][y+1]=s[x][y];s[x][y]=temp; y=y+1;}
                break;
            case '0': break;
            default : flag=0; break;
        }
        if(!flag) break;
    }
    if(flag)
    {
            for(int i=0;i<5;i++)
        {
            for(int j=0;j<5;j++)
            {
                printf("%c ",s[i][j]);
            }
            printf("\n");
        }
    }
    else printf("This puzzle has no final configuration\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/j1137573560/article/details/81434780