题解:谜题(UVa 227)

本文提供了一种解决UVA-227滑块谜题的方法,详细介绍了通过C语言实现的解决方案,并针对输入输出进行了特别说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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])则会遇到空格后自动结束该行内容的输入,造成错误。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值