UVA - 227. Puzzle题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/82156276

UVA - 227. Puzzle题解

欢迎访问我的Uva题解目录https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

UVA - 227. Puzzle题目描述

题意解析

一个5*5的网格,其中有一个网格是空的。A、B、L、R四种指令分别表示将空网格上下左右的相邻字母移入到空格中。输入初始网格和指令序列,要求输出最终的网格图。

注意点

输出时每两个puzzle之间都要有一个空行,但最后一个puzzle后没有空行。

C++代码

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
using namespace std;
int main(){
    char puzzle[5][5];
    int emptyi,emptyj;//空白方格的横纵坐标
    for(int k=1;true;++k){//k表示第几场puzzle游戏
        _for(i,0,5){
            _for(j,0,5){
                puzzle[i][j]=getchar();//读取整个puzzle
                if(puzzle[0][0]=='Z')//读取到了Z字符,直接结束游戏
                    goto loop;
                if(puzzle[i][j]==' '){//读取到了空白字符,确定空白方格的横纵坐标
                    emptyi=i;
                    emptyj=j;
                }
            }
            getchar();//读取后面的换行符
        }
        if(k>1)
            puts("");//输出每两个Puzzle之间的空行,注意最后一个Puzzle后没有空行
        printf("Puzzle #%d:\n",k);
        bool f=true;//表示有没有最终的puzzle
        for(char c=getchar();c!='0';c=getchar()){//读取到字符0才算结束
            int tempi=emptyi,tempj=emptyj;
            if(c=='A'&&emptyi>0)
                --emptyi;
            else if(c=='B'&&emptyi<4)
                ++emptyi;
            else if(c=='L'&&emptyj>0)
                --emptyj;
            else if(c=='R'&&emptyj<4)
                ++emptyj;
            else if(c!='\n')//略过换行符
                f=false;
            if(f)
                swap(puzzle[tempi][tempj],puzzle[emptyi][emptyj]);//交换两个字符
        }
        if(f){
            _for(i,0,5){//输出整个puzzle
                _for(j,0,5)
                    printf("%c%s",puzzle[i][j],j<4?" ":"");
                puts("");
            }
        }else
            puts("This puzzle has no final configuration.");
        getchar();//读取后面的换行符
    }
loop:
    return 0;
}

猜你喜欢

转载自blog.csdn.net/richenyunqi/article/details/82156276