谜题

题目

有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。

一共有4中指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移动到空格中。

输入初始网格和指令序列(以数字0结束),输入指令执行完毕后的网格。

如果有非法指令,应输出“This puzzle has no final configuration.”,例如,

图中执行ARRBBL0后,效果如下:

 

 

分析

首先要解决输入问题,因为这里有空格,不能直接使用scanf语句。可以用for循环解决。

然后是需要记录空格的位置,之后根据命令进行移动。

但是需要判断命令字符是否合法及是否已经移动到边界。

 

c实现

复制代码
#include<stdio.h> 
#include<string.h>
#define maxn 10000

char a[8][8];
char command[maxn];
int main()
{
    //blank_x,blank_y标记空格位置;flag标记指令是否合法 
    int blank_x,blank_y,flag=1;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            a[i][j]=getchar();
        }
    } 
    
    printf("效果:\n");
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            printf("%c ",a[i][j]);
        }
        printf("\n");
    }

    //检测空格位置
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            if(a[i][j]==' '){
                blank_x = i;
                blank_y = j; 
            } 
        }
    } 
    
    scanf("%s",command);
    int n = strlen(command);
    if(command[n-1]=='0'){
        for(int i=0;i<n-1;i++)
        {
            if(command[i]=='A'||command[i]=='B'||command[i]=='L'||command[i]=='R'){
                if(command[i]=='A'&&blank_x>0){
                    a[blank_x][blank_y] = a[blank_x-1][blank_y];
                    a[--blank_x][blank_y] = ' '; //这里移动后的位置的值置为空格,要使用a[--blank_x],而不能用a[blank_x-1] 
                }
                if(command[i]=='B'&&blank_x<4){
                    a[blank_x][blank_y]=a[blank_x+1][blank_y];
                    a[++blank_x][blank_y]=' ';
                }
                if(command[i]=='L'&&blank_y>0){
                    a[blank_x][blank_y]=a[blank_x][blank_y-1];
                    a[blank_x][--blank_y]=' ';
                }
                if(command[i]=='R'&&blank_y<4){
                    a[blank_x][blank_y]=a[blank_x][blank_y+1];
                    a[blank_x][++blank_y]=' '; 
                }
            }else{
                flag=0;
                break;
            }
        }
    }else{
        flag=0;
    }
    //结果输出 
    if(flag){
        for(int i=0;i<5;i++)
        {
            for(int j=0;j<5;j++)
            {
                printf("%c ",a[i][j]);
            }
            printf("\n");
        }
    }else{
        printf("This puzzle has no final configuration.");
    }

    return 0;
}
复制代码

 要使用a[--blank_x],而不能用a[blank_x-1]

这里做下说明,因为这里1.不仅要给a[blank-1]赋值为空格,而且2.需要更新空格blank_x的值,即blank_x也已经改变了。

所以使用a[--blank_x]来完成这两个作用。

posted @   Vincent-yuan  阅读(401)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2019-05-23 java之struts2的数据处理
点击右上角即可分享
微信分享提示