C语言系列3——打印叠筐(用二维数组打印)

图案问题 → 二维数组 + 找数字规律

此图片来自王道机试课程
图片来自王道机试课程

OJ当中的各种错误

  • Wrong Answer → 答案错误 → 思路有问题,少考虑了某些场景
  • Accepted → 通过
  • Compilation Error → 编译错误 → 一般是复制粘贴时产生的问题
  • Presentation Error → 表示错误 → 换行有问题,多打或者少打了换行 → 重新读题目

代码

#include <cstdio>

//叠筐
int main() {
    int n;// n 是外框的长度
    char inner,outter;//内和外的花色
    bool flag = true;//flag用来判断是否是第一个结果
    while(scanf("%d %c %c",&n,&inner,&outter) != EOF){
        //处理空行的显示
        if(flag == true){
            flag = false;
        } else{
            printf("\n");
        }
        //scanf %d -- 十进制 %f -- 浮点数 %o -- 八进制 忽略空白字符
        //scanf %c -- 字符 可以读取空白字符(空格和换行)
        //scanf %c 如果前面有空格,则忽略空白字符
        //printf("n = %d, inner = %c, outter = %c",n,inner,outter);

        //数值上'\0'、NULL、0都是相等的,存入char中时都可以作char字符串的字符串结束符
        char pattern[80][80] = {0};//二维数组的长度要写固定
        //在定义二维数组时,可以初始化
        int length = 1; //外框的长度
        int x,y;
        char curChar = inner;//用来填充的花色
        for (length = 1, x = n/2, y = n/2; length <= n ; length = length + 2, --x, --y) {
            // x和y是起点的下标
            // 填满一个长度为length的正方形
            // 从左上到左下
            for (int i = x, j = y; i < x+length; ++i) {
                // j不变,i从x到x+length-1
                pattern[i][j] = curChar;
            }
            // 从上左到上右
            for (int i = x, j = y; j < y+length; ++j) {
                // i不变,j从y到y+length-1
                pattern[i][j] = curChar;
            }
            // 从下左到下右
            for (int i = x+length-1, j = y; j < y+length; ++j) {
                // i不变 i = x+length-1,j从y到y+length-1
                pattern[i][j] = curChar;
            }
            // 从右上到由下
            for (int i = x, j = y+length-1; i < x+length; ++i) {
                // j不变 j = y+length-1,i从x到x+length-1
                pattern[i][j] = curChar;
            }
            // 更换花色
            if(curChar == inner){
                curChar = outter;
            } else{
                curChar = inner;
            }
        }
        //磨掉4个角
        if(n != 1){
            pattern[0][0] = ' ';
            pattern[0][n-1] = ' ';
            pattern[n-1][0] = ' ';
            pattern[n-1][n-1] = ' ';
        }

        //按行打印
        for(int i = 0; i < n; ++i){
            printf("%s\n",pattern[i]);
        }
    }

    return 0;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值