UVa 227 Puzzle(谜题)

①输入55的字符,每个格子有一个字母,有一个格子是空格
②找出输入字符空格的具体位置,保存下来
③之后分别检测指令A,B,L,R,这里还需要注意边界的地方,
④最后根据指令进行移动,最后从新输出每个格子的每个字符
学习笔记:
①这道题跟以前那道填数字的题目,有区别,因为题目中需要两个输入,格子形状输入用gets(a[i])表示第几行。输出的时候可以采用循环printf("%c %c %c %c %c\n", a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]); 注意这里输入不能用scanf因为有一个是空格。这样就输出我们需要的结果了。
②对于检测指令,第一步是如果是非法指令,但是我们不好描述条件时,输出,这个时候为了和和发指令区分开来,所以我们设置了一个flag,如果非法时,我们设为0这样最后输出的时候,我们就有条件
③检测指令的时候,还需要注意边界问题,记住a[x][y] x代表的是竖直方向,y代表的是水平方向。一定要注意边界问题
④检测到指令的时候,我们首先需要将空格移动到目标位置的值放在空格区域,之后把空格放入目标区域这个与以前填数多一步,因为以前那个目标区域全是0

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <map>

using namespace std;

const int maxn = 20;
char s[10000];
char a[maxn][maxn];

int main(){
    int kx=0,ky=0,flag=1;
    gets(a[0]);
    gets(a[1]);
    gets(a[2]);
    gets(a[3]);
    gets(a[4]);
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(a[i][j]==' '){
                kx=i;
                ky=j;
            }
        }
    }
    scanf("%s",s);
    int len=strlen(s);
    for(int i=0;i<len;i++){
        if(s[len-1]=='0'||s[i]=='A'||s[i]=='B'||s[i]=='L'||s[i]=='R'){
            if(s[i]=='A'&&kx!=0){
                a[kx][ky]=a[kx-1][ky];
                a[--kx][ky]=' ';
            }
            if(s[i]=='B'&&kx!=4){
                a[kx][ky]=a[kx+1][ky];
                a[++kx][ky]=' ';
            }
            if(s[i]=='L'&&ky!=0){
                a[kx][ky]=a[kx][ky-1];
                a[kx][--ky]=' ';
            }
            if(s[i]=='R'&&ky!=4){
                a[kx][ky]=a[kx][ky+1];
                a[kx][++ky]=' ';
            }
        }else flag=0;
    }
    if(flag){
        for(int i=0;i<5;i++){
            printf("%c %c %c %c %c\n",a[i][0],a[i][1],a[i][2],a[i][3],a[i][4]);
        }
    }
    else{
        printf("This puzzle has no final configuration.\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值