叠筐

作者: 灵光的键盘家 | 来源:发表于2020-04-26 14:29 被阅读0次

    前言:常见于机试题里的图形表示题,能很好考察我们的逻辑分析和编程基础能力。这道题我见于《王道机试》第二版,仔细理解后,与大家分享下思路,末尾总结规律。

    • 题目描述:把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
    • 输入:输入是一个个三元组,分别是:外筐尺寸n (n为满足0<n< 80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符。
    • 输出:输出叠在一起的筐图案, 中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
    • 样例 image.png
      分析:图形表示题解题首先要找到规律。题目文字比较拗口,我们直接从样例观察,需要时再去回顾题目。样例所给的n比较大,我们不妨从n=1,n=3开始观察规律。
      image.png
    • 结合样例,观察到从另一个花色包围中心字符开始,每一圈花色交替,但是最外圈的四个角看着非常扎眼,这也说明我们在写算法时很难越过这四个角。
    • 缺什么补什么,我们不妨先将四个角补上,将规律变为规整的易于表示的,在最后想办法去掉四个角。这样图形规律是不是更一目了然,只是简单的每圈花色交替。
    • 要用代码表示这个类似矩阵的图形,且末尾想要实现删除四个角,我们应该能想到一个非常合适的媒介——二维数组,将四个角的数组元素替换为空格即可实现删除。
      接下来直接用代码表示这个规律。
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    char matrix[80][80];                //定义二维数组
    
    int main(){
        int n;                  //叠筐的边长
        char a,b;                   //定义输入字符a,b类型
        int gap=0;                  //添加每个输入用例之间的间隔
        while(scanf("%d %c %c",&n,&a,&b)!=EOF){     //允许多例输入
            if(gap==0)
                gap=1;      
            else
                printf("\n");
    
            int i,j;
            int length;                 //length是当前圈的边长
    
            for(i=0;i<=n/2;i++){        //i是当前圈左上角的下标,n/2+1是图形总圈数
                length = n-2*i;         //当前圈边长是总边长减去外圈的两侧
                j = n-i-1;              //j是当前圈右下角的下标
                char c;
    
                if((n/2-i)%2==0)            //判断当前圈花色
                    c=a;
                else
                    c=b;
                
                int k;
                for(k=0;k<length;k++){  //遍历对当前圈二维数组元素赋值
                    matrix[i][i+k] = c;     //对当前圈上侧赋值
                    matrix[i+k][i] = c;     //对当前圈左侧赋值
                    matrix[j][j-k] = c;     //对当前圈右侧赋值
                    matrix[j-k][j] = c;     //对当前圈下侧赋值
                }
            }
    
            if(n!=1){                   //去掉四个角
                matrix[0][0] = ' ';     //注意这里要用单引号
                matrix[0][n-1] = ' ';
                matrix[n-1][0] = ' ';
                matrix[n-1][n-1] = ' ';
            }
            for(i=0;i<n;i++){           //从二维数组遍历输出图形
                for(j=0;j<n;j++){
                    printf("%c",matrix[i][j]);
                }
                printf("\n");
            }
        }
        return 0;
    }
    

    总结:数组可以存储数组元素,易于修改也易于输出。我们要利用好数组的特性去处理这些图形表示题目。
    图形表示解题关键在于抓住规律,然后用合适的算法和数据结构去表达出这个规律。对于不显眼或不好处理的规律,我们优先考虑将规律优化规整,即缺什么补什么,便于用编程语言去实现不规则图形。

    相关文章

      网友评论

        本文标题:叠筐

        本文链接:https://www.haomeiwen.com/subject/fogdwhtx.html