• 谜题


    题目

    有一个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("效果:
    ");
        for(int i=0;i<5;i++)
        {
            for(int j=0;j<5;j++)
            {
                printf("%c ",a[i][j]);
            }
            printf("
    ");
        }
    
        //检测空格位置
        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("
    ");
            }
        }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]来完成这两个作用。

  • 相关阅读:
    $(document).ready() 、 $('#id').load() 、window.onload 的区别
    Ajax的Get和Post的区别
    jquery slideDown slideUp 对于table无效
    .net 中连接mysql
    数据库日志文件太大如何处理
    支持IE,FireFox,Chrome三大主流浏览器,通过js+Flash方式将table导出Excel文件
    Sql2008的行列转换之行转列
    Java 8最快的垃圾收集器是什么?
    window.location.hash属性介绍
    高并发量网站解决方案
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/12944165.html
Copyright © 2020-2023  润新知