清华机试——叠筐问题

题目描述:

把一个个大小差一園的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机完成,得看你的了。

输入:

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

输出:

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

样例输入:

11 B A

5 @ W

样例输出:

AAAAAAAAA

ABBBBBBBBBA

ABAAAAAAABA

ABABBBBBABA

ABABAAABABA

ABABABABABA

ABABAAABABA

ABABBBBBABA

ABAAAAAAABA

ABBBBBBBBBA

AAAAAAAAA

@@@

@WWW@

@W@W@

@WWW@

@@@

题目分析

采用数组填充法:

  • 提前分配好固定大小的数组
  • 将一圈填充视作一次循环,确定每次循环的起点位置,即最左上坐标(loc,loc),以及每圈的长度length
  • 从最中心处开始由内向外一圈一圈进行数组填充
  • 切记,四个角并无填充,在数组中去掉,或者打印时避免
#include <stdio.h>
//叠框问题
int main(){
    
    
    int n;
    char a, b;//a在内
    while(scanf("%d %c %c", &n, &a, &b) != EOF){
    
      //输入个数未知,用循环接受
        printf("n=%d,a=%c,b=%c\n", n, a, b);
        char pic[80][80] = {
    
    0}; //每一个元素都被初始化为\0
        int flag = 1; //控制字符为a或b,初始为a,每层交替变换
        char ch;
        for(int length = 1, loc = n/2;length <= n;length += 2, loc--){
    
    //更新每一圈的起始位置(loc, loc)和长度
            if(flag == 1){
    
    
                ch = a;
            }else{
    
    
                ch = b;
            }
            for (int i = 0; i < length; i++) {
    
    //上下边框
                pic[loc][loc+i] = ch;
                pic[loc+length-1][loc+i] = ch;
            }
            for (int i = 1; i < length - 1; i++){
    
    //左右边框
                pic[loc+i][loc] = ch;
                pic[loc+i][loc+length-1] = ch;
            }
            flag = flag*(-1); //改变符号标志
        }
        for (int i = 0; i < n; i++) {
    
    
            for (int j = 0; j < n; j++) {
    
    
                if((n!=1)&&(((i == 0)&&(j == 0)) || ((i == n-1)&&(j == 0)) || ((i == 0)&&(j ==n-1)) || ((i ==n-1)&&(j == n-1)))){
    
     //四个角不进行输出
                    printf(" ");
                }else{
    
    
                    printf("%c", pic[i][j]);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

结果展示

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

猜你喜欢

转载自blog.csdn.net/gary101818/article/details/128928085