Uva227-Puzzle-谜题

题目链接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<stdio.h>
#include<iostream>
#include<string.h>
#include<ctype.h>
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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值