题解:谜题(UVa 227)

来源:互联网 发布:python import path 编辑:程序博客网 时间:2024/05/17 10:57
  1. 题目链接:https://vjudge.net/problem/UVA-227
  2. 解题思路:略;
  3. AC截图:
    这里写图片描述
  4. AC代码:
#include<stdio.h>#include<string.h>char s[5][7];int x,y;int num=0;int main(){    while(fgets(s[0],7,stdin)){        if(s[0][0]=='Z')return 0;//终止输入标志    for(int i=1;i<5;i++)    fgets(s[i],7,stdin);//使用fgets而不用scanf("%s",s[i]);                        //是为了能让空格也输入进s[i],    //读取25宫格完毕    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)        if(s[i][j]==' '){            x=i;y=j;break;        }//找到空格在数组中的位置    char move[20];    int i=0;    while(move[i]=getchar()){        if(move[i]=='\n')i--;//case中有间断输入        if(move[i]=='0')break;//输入结束        else i++;    }    move[i]='\0';//因为getchar()不会主动添加上字符结束标志                 //所以此处手动添加;    getchar();//吃掉最后缓冲区的换行符    int x1,y1;int flag=0;    for(i=0;move[i];i++){        switch(move[i]){            case('A'):x1=x-1;y1=y;break;            case('B'):x1=x+1;y1=y;break;            case('L'):x1=x;y1=y-1;break;            case('R'):x1=x;y1=y+1;break;            default: flag=1;//标记处非法移动指令        }    //找到了最终的位置x1,y1        if(x1<0||x1>4||y1<0||y1>4){            flag=1;break;   //标记出超越范围的移动结果        }else{            s[x][y]=s[x1][y1];            s[x1][y1]=' ';  //交换了空格和终位置的字符            x=x1;y=y1;      //更新空格位置        }    }    if(num)printf("\n");    printf("Puzzle #%d:\n",++num);    if(flag)printf("This puzzle has no final configuration.\n");    else {        for(i=0;i<5;i++){            printf("%c",s[i][0]);            for(int j=1;j<5;j++)            printf(" %c",s[i][j]);//注意输出格式中有空格            printf("\n");        }    }    }   }

5. 注意点: 本题不容易AC的地方在于如何处理好字符的输入输出,其中fgets的地方用gets也可以运行,但是平台上通不过,根据本书前面的介绍,gets函数很可能已经被废除,因此也尽量不要再使用。而fgets(buf,max,fin/stdin)表示从文件fin或者标准输入流stdin中读入直到遇见’\n’(并作为最后一个字符包含进数组)或者直到max-1个字符char buf[max]中,然后在后面自动加上‘\0’;而如果改用scanf(“%s”,s[i])则会遇到空格后自动结束该行内容的输入,造成错误。


以上代码也许还不是很好,欢迎朋友评论以交流和分享更优秀的代码。

0 0
原创粉丝点击