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;
}