zoukankan      html  css  js  c++  java
  • 谜题

    题目

    有一个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]来完成这两个作用。

  • 相关阅读:
    ant 软件包不存在报错
    在 Internet Explorer 中使用 Windows 窗体控件
    智能客户端
    Back to the Future with Smart Clients
    "Automation 服务器不能创建对象" 的解决方案
    Top 10 Reasons for Developers to Create Smart Clients
    Updater Application Block for .NET
    Smart Client Application Model and the .NET Framework 1.1
    Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients
    智能客户端技术总结(二)
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/12944165.html
Copyright © 2011-2022 走看看