算法心得

叠筐

2020-04-26  本文已影响0人  灵光的键盘家

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

#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;
}

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

上一篇 下一篇

猜你喜欢

热点阅读