叠筐

作者: 灵光的键盘家 | 来源:发表于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;
}

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

相关文章

  • 叠筐

    前言:常见于机试题里的图形表示题,能很好考察我们的逻辑分析和编程基础能力。这道题我见于《王道机试》第二版,仔细理解...

  • 排版题——2. 叠筐

    解题心得: 排版问题如果规律太难,可以先将其预存在数组里,最后再一起打印 给字符复制空格的时候,写成“ ”的形式,...

  • 20190417宝宝能够自己做的事情

    2-3岁:自己穿衣服,把玩具收拾到收纳筐,脏衣服放进收纳筐,擦桌子,扔垃圾,把书摆好。 4-6岁:叠被子,摘菜洗菜...

  • 我用二十九年编织了一个筐,用那些来自熟识人鼓励、认可的竹条,在筐中用力编着。 终于发现自己编的没有盖,而是一个圆滚...

  • 2018-06-13 机试准备04

    排版题 一、例2.7 输出梯形 该规律顺序与输出顺序一致,可以从上至下、从左至右应用规律。 二、例2.8 叠筐 图...

  • 一道小升初压卷题的解题思路和方法。

    甲筐桃子是乙筐桃子的13/19,从甲筐拿出10个桃子放入乙筐,这时甲筐桃是乙筐桃的1/3,问原来甲筐和乙筐各有多少...

  • 这边,那边

    我在这边, 你在那边。 我把一块块一片片一张张 垒叠,堆积, 你把一个个一条条一筐筐 打包,安放。 你把日子排满忙...

  • BIM的忧郁日记:四、最坏的恶意揣测

    挨到周末,学生们熙熙攘攘地去校外澡堂子洗澡。他们各个拎着小浴筐,仿佛去夏威夷沙滩度假般惬意。我掏出一叠校内浴池的澡...

  • 【妞妞日记】||劳动真快乐

    今天早上我起床准备跟妈妈一个惊喜,我把我们的内衣收纳筐里面东西叠的可整齐啦。 我把妈妈的内衣拿到了床上,先把那个角...

  • 声音练习Day 18 绕口令

    哥挎瓜筐:哥挎瓜筐过宽沟,赶快过沟看怪狗。光看怪狗瓜筐扣,瓜滚筐空哥怪狗。 光和筐发音别扭

网友评论

    本文标题:叠筐

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