王道机试指南NO.6排版题叠筐

版权声明:本博全为博主学习日常,均为原创,请勿转载 https://blog.csdn.net/weixin_44332298/article/details/87879900

时间限制:1s 内存限制:128MB

题目描述

把一个个大小差一圈的筐叠上去。使得从上往下看时,边筐花色交错。

输入

输入一个三元组,分别是外筐尺寸n,(n为满足0 < n < 80的奇整数),中心花色字符,外筐花色字符,后两者都为ASCII可见字符。

输出

输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。

样例输入

11 B A
5 @ W

样例输出

在这里插入图片描述
在这里插入图片描述

题目分析

1、排版题的两种解题思路:①找规律,量化后直接写入程序的输出部分;②先完成排版,再进行输出。
2、此题选用思路②,利用一个缓存数组来表示将要输出的字符阵列,规定阵列左上角字符坐标为(1,1),阵列右下角字符坐标为(n,n)。按从最内圈至最外圈的顺序来完成图形的排列。
3、首先要确定该圈左上角的坐标,最中间圈的左上角字符坐标为(n/2+1,n/2+1),次中间圈的左上角字符坐标为(n/2+1-1,n/2+1-1);其次,外圈总比内圈长度增加2。
4、使用循环变量j的奇偶性来判断当前需要使用的字符。利用变量i所存的值我们即可对当前圈的四条边进行赋值。
5、边界数据的处理,当n为1时,如果处理矩阵四角为“ ”,则输出一个空格,这显然不符合题意

代码

#include <stdio.h>

int main(){
    int outPutBuf[82][82];//用于预排版的输出缓存
    char a, b;
    int n;
    bool firstCase = true; //标记是否为第一组数据
    while(scanf("%d %c %c", &n, &a, &b) == 3){
        if(firstCase == true){
            firstCase = false;
        }
        else{
            printf("\n");//输出格式,除了第一行外,其余各行之前都加换行
        }
        for(int i=1, j=1; i <= n; i+=2, j++){//从里到外输出各个圈
            int x = n/2+1, y = x;
            x -= j-1;
            y -= j-1;//计算每个圈左上角点的坐标
            char c = j%2 == 1 ? a : b; //计算当前圈需要使用哪个字符
            //printf("%d %d\n", x, y);
            for(int k=1; k <= i; k++){
                outPutBuf[x+k-1][y] = c; //左边赋值
                outPutBuf[x][y+k-1] = c; //上边赋值
                outPutBuf[x+i-1][y+k-1] = c; //右边赋值
                outPutBuf[x+k-1][y+i-1] = c; //下边赋值
            }
        }

        if(n != 1){
            outPutBuf[1][1] = ' ';
            outPutBuf[1][n] = ' ';
            outPutBuf[n][1] = ' ';
            outPutBuf[n][n] = ' ';
        }

        for(int i=1; i <= n; i++){
            for(int j=1; j <= n; j++){
                printf("%c", outPutBuf[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44332298/article/details/87879900