原题链接: https://vjudge.net/problem/UVA-227
题目描述:
1 > 有一个5*5的网格,只有一个格子是空格,其余的都是字母。
2 > 4个指令 A,B,L,R,分别代表向上向下向左向右。
3 > 输出执行完后的网格内的情况。
4 > 若有越界则单独输出
思路:使用scanf输入,用getchar()吸收换行符,题目要求跟华容道游戏类似,先记录空白的位置,然后按照步骤移动即可。另外这里用isspace()函数判断输入的字符是否为换行符
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
char a[5][5];
char c;
int b=0;
while(1){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%c",&c);
a[i][j]=c;
if(a[0][0]=='Z')return 0;
}
getchar(); //吸收换行符
}
int i,j,flag1=0,flag2=0;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(a[i][j]==' '){ //记录空白的位置
flag1=1;
break;
}
}
if(flag1)break;
}
while((c=getchar())!='0'){ //做出操作
if(c == 'A' && i-1 >= 0){
a[i][j] = a[i-1][j];
a[i-1][j] = ' ';
i -= 1; //更改空格的位置 下同
}
else if(c == 'B' && i+1 < 5){
a[i][j] = a[i+1][j];
a[i+1][j] = ' ';
i += 1;
}
else if(c == 'L' && j-1 >= 0){
a[i][j] = a[i][j-1];
a[i][j-1] = ' ';
j -= 1;
}
else if(c == 'R' && j+1 < 5){
a[i][j] = a[i][j+1];
a[i][j+1] = ' ';
j += 1;
}
else if(isspace(c))continue; //判断c是否为换行符等
else flag2=1; //非法指令
}
getchar();
if(!b)printf("Puzzle #%d:\n", ++b); //按照格式输出
else printf("\nPuzzle #%d:\n", ++b);
if(flag2){ //如果有非法指令
printf("This puzzle has no final configuration.\n");
continue;
}
for(int i=0;i<5;i++){ //输出操作后的结果
for(int j=0;j<5;j++){
if(!j)printf("%c",a[i][j]);
else printf(" %c",a[i][j]);
}
printf("\n");
}
}
return 0;
}