【刘汝佳书】习题3-5 UVA227

本文详细介绍了UVA227题目的输入格式和指令序列要求,包括5*5字符矩阵的处理,如何忽略多余的空格和无效指令,并提醒注意在处理指令序列时读取末尾的换行符。此外,还提供了示例帮助理解题意。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVA刷题方法:https://blog.youkuaiyun.com/richenyunqi/article/details/80990535#commentBox

【2019.3.24】
这题的格式真的是……折磨死人了……

1、输入格式:
5* 5的字符矩阵,每行5个字符(字母或空格),每行末尾有0到若干无用空格,每行最后有一个换行符
下面这个例子里,只有第一个空格在5*5的矩阵里应该保存,剩下俩空格都是每行末尾的无用字符,应该丢弃
例子:
ABCD空
FGHIJ空
KLMNO
PQRSY空
TUVWX

2、指令序列,有可能有多行,有可能有多余空格,有可能有除了ABLR以外的非法指令
下面这个例子里,指令序列有两行,第一行末尾有多余空格,第二行有一个非法指令Q
例子:
ARR空
BBLQ0

3、要记得用getchar读取指令序列最后的换行
4、输出的数据中,每两个之间隔一个空行

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>

using namespace std;

char puzzle[5][5];

int x[30];

int a[4][2]=
{
    -1,0,   //A
    +1,0,   //B
    0,-1,   //L
    0,+1    //R
};

int main()
{
    //freopen("C:/Users/summer/Desktop/output.txt","w",stdout);

    x['A'-'A'] = 0;
    x['B'-'A'] = 1;
    x['L'-'A'] = 2;
    x['R'-'A'] = 3;

    char c;
    char op;
    int num = 0;
    int zx,zy;
    int nx,ny;
    while(true) {
    	//输入5*5的网格
        for(int i=0; i<5; i++) {
            for(int j=0; j<5; j++) {
                puzzle[i][j]=getchar();
                if(puzzle[0][0]=='Z')		//结束条件:Z
                    return 0;
                if(puzzle[i][j]==' ') {		//记录空格在的位置
                    zx = i;
                    zy = j;
                }
            }
            while((c=getchar()) && c!='\n');	//丢弃每一行末尾的无效字符
        }
		
		//输入指令序列,每输入一个就判断是否合法
        bool flag = true;	//用于判断指令序列是否合法
        while((op=getchar()) && op!='0') {
            if(!isalpha(op))	//去除多余空格和换行符
                continue;
            if(!(op=='A' || op=='B' || op=='L' || op=='R'))	//非法指令
                flag = false;
            nx = zx + a[x[op-'A']][0];	//计算要与空格交换的字母位置
            ny = zy + a[x[op-'A']][1];
            if(flag && nx>=0 && nx<5 && ny>=0 && ny<5) {	//字母位置不能越界
                swap(puzzle[zx][zy], puzzle[nx][ny]);	//交换字母和空格
                zx = nx;	//记录空格的新位置
                zy = ny;
            }
            else if(flag) {	//如果越界,则这个指令非法
                flag = false;
            }
        }
        getchar();	//去除数字0之后的换行符

		//输出
        if(num) cout<<endl;	//如果不是第一个例子,就输出一个空行
        num++;
        cout<<"Puzzle #"<<num<<":"<<endl;
        if(flag) {		//如果指令合法,就输出结果
            for(int i=0; i<5; i++) {
                for(int j=0; j<5; j++) {
                    if(j) cout<<' ';	//每一行的5个字符用4个空格隔开
                    cout<<puzzle[i][j];
                }
                cout<<endl;
            }
        }
        else cout<<"This puzzle has no final configuration."<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值