题目链接https://vjudge.net/problem/UVA-227
类似于推箱子游戏,问你推完之后是什么样子。中途有非法操作比方说推到墙了继续推就输出错误信息。
二维数组的模拟,要注意细节。
1、读入一行字符。这里用的是cin.getline(),其语法为:cin.getline(字符指针(char*),字符个数N(int),结束符(char));
如果用string.h里面的getline的话,比方说getline(cin,str),存放到string类型的str中,这个一般用于读取整行的string,比如读取文件中。这里方便字符操作用cin.getline。
链接两篇文章,做深入了解。cin.getline、getline和gets的区别http://blog.csdn.net/ysf13579/article/details/23447945
C++中getline()、gets()等函数的用法 http://blog.csdn.net/JIEJINQUANIL/article/details/50802902
2、读取一行的操作,结束标识符\0的处理。这一题中可能读取一行为“POIU空格+回车”或者“POIU回车”或者“POIU空格+空格+回车”。。。有点无语。还有注意输出格式,仔细模拟。
#include
#include
#include
#include
using namespace std;
int main(){
char z,pan[10][10];
int num=0,i=0,j=0,x=0,y=0,flag=1,count=0;
while(1){
for(int i=0;i<5;i++){
cin.getline(pan[i],10);//注意此函数的用法
if(pan[i][0]=='Z') return 0;
if(pan[i][4]=='\0') pan[i][4]=' ';//cin.getline()函数自动在结尾处添加结束标志'\0'
}
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(pan[i][j]==' '){x=i,y=j;}
}
}
//printf("x=%d y=%d\n",x,y);
while(~scanf("%c",&z)){
if(z=='A'){
if(x>=1){pan[x][y]=pan[x-1][y];x=x-1;}
else flag=0;
}else if(z=='B'){
if(x<=3){pan[x][y]=pan[x+1][y];x=x+1;}
else flag=0;
}else if(z=='L'){
if(y>=1){pan[x][y]=pan[x][y-1];y=y-1;}
else flag=0;
}else if(z=='R'){
if(y<=3){pan[x][y]=pan[x][y+1];y=y+1;}
else flag=0;
}else if(z=='0') break;
}
getchar();//注意上面'ABLR0'之后的回车,消去回车
if(count++) printf("\n");
printf("Puzzle #%d:\n",count);
if(flag){
pan[x][y]=' ';
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j==4) printf("%c\n",pan[i][j]);
else printf("%c ",pan[i][j]);
}
}
}else{
printf("This puzzle has no final configuration.\n");
/*for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j==4) printf("%c\n",pan[i][j]);
else printf("%c ",pan[i][j]);
}
}*/
}
num=0,x=0,y=0,flag=1;
memset(pan,' ',sizeof(pan));
}
return 0;
}