原题就不贴了,主要意图是输入有一个空格存在的5*5数组,输入带有转行符的字符串对空格进行上下左右控制,以0为结束,输出移动后的数组
这道题是需要细心的,该注意的地方有以下几点:
1、输入格式比较琐碎,因为有空格所以不支持scanf,使用gets函数接受每行数据包括空格,使用scanf函数接受包含转行符的字符串
2、注意每个变量的作用域,在循环一次之后要保证你的flag、nx、ny等变量还能回到初始状态,不然容易出现puzzle2不符合要求的情况
3、防止出现runtime error,将数组定义放置在main函数外面
4、重点是空格位置的变换。
这道题编完还是有很多收获的,下面给出源码
#include <iostream>
using namespace std;
char a[5][7];
char b[100];
int main(){
int num = 0;
while(gets(a[0])){
if(a[0][0]=='Z') break;
for(int i =1;i<5;i++){
gets(a[i]);
}
int bx=0;
int by = 0;
for(int m =0;m<5;m++){
for(int n = 0;n<5;n++){
if(a[m][n]==' '){
bx = m;
by = n;
break;
}
}
}
int length = 0;
while(scanf("%c",&b[length])==1){
if(b[length]!='0') length++;
else break;
}
b[length] = 0;
getchar();//这里等待用户按回车
int flag = 0;
int nx = bx;
int ny = by;
for(int i =0;b[i];i++){
if(b[i]=='A'){
nx = bx-1;
ny = by;
}else if(b[i]=='B'){
nx = bx+1;
ny = by;
}else if(b[i]=='L'){
ny = by-1;
nx = bx;
}else if(b[i]=='R'){
ny = by+1;
nx = bx;
}
if(nx<0||nx>4||ny<0||ny>4){
flag=1;
break;
}else{
a[bx][by] = a[nx][ny];
a[nx][ny] = ' ';
bx = nx;
by = ny;
}
}
if(num ++) printf("\n");
cout<<"Puzzle #"<<num<<":"<<endl;
if(flag){
printf("This puzzle has no final configuration.\n");
}else{
for(int i =0;i<5;i++){
for(int j =0;j<5;j++){
if(j==4){
cout<<a[i][j]<<endl;
}else{
cout<<a[i][j]<<" ";
}
}
}
}
}
return 0;
}