王道机试第一章:暴力求解-模拟篇 图形排版 Day24

文章介绍了如何使用二维数组和循环结构解决图形排版问题,如输出梯形和模拟筐叠图案,涉及输入输出控制和ASCII字符的使用。
摘要由CSDN通过智能技术生成

1、图形排版

图形排版是最为常见的模拟类题型,这类题目要求考生按照特定规则输出字符,主要考查
考生对输出格式的把握。通常来说这类题目的规律性比较强,掌握了题目中的规律,题目便能
迎刃而解。
一般思路(二维数组+列出循环规律)

1)申请二维数组(固定大小,放在全局变量的位置) 2)根据条件,从任意方向开始设置二维数组; 3)把图案的每一行的边界的后一个位置使用'\0' 赋值; 4)使用printf和 %s 配合循环打印每一行

输出梯形(清华大学复试上机题)

题目描述:

输入一个高度 h,输出一个高度为 h、上底边长度为 h 的梯形。

输入: 一个整数 h 1 <=   h <= 1000 )。
输出: h 所对应的梯形。
样例输入:
4
样例输出:
        ****
      ******
   ********
**********
思路:循环—对于循环内语句写一些找找规律  空格 和 * 来用h表示;
代码表示:
#include<bits/stdc++.h>
using namespace std;

//要用while循环实现不确定的输入 
int main()
{
   int h;
   //scanf返回值是整数:1.返回读取内容个数 %d 2.EOF文件终止符 
   while(scanf("%d",&h)!=EOF)//while配合scanf 
   {
   for(int i=0;i<h;++i){//第一列 
   	for(int j=0;j<2*h-2-2*i;++j){//空格 
   	    printf(" ");}
   	for(int j=0;j<h+2*i;++j){//连着上面打印* 
   		printf("*");
	   }
	   printf("\n");
     }
  }
}
 
补充:

使用二维数组处理图案模拟问题

补充二维数组代码:
#include <bits/stdc++.h>
using namespace std;

// 定义全局数组,申请较大的空间
char arr[1000][3000];

int main() {
    int h;
    while (scanf("%d", &h) != EOF) {
        // 将区域都填上空格
        for (int i = 0; i < h; ++i) {
            for (int j = 0; j < 3 * h - 2; ++j) {
                arr[i][j] = ' ';
            }
        }

        // 填充梯形区域
        int beg=0;//注意作用域问题 
        //最后一行下标是 h-1,注意他是从0开始的 
        for (int i = h - 1; i >= 0; --i) {
            //int beg = 0;
            for (int j = beg; j < 3 * h - 2; ++j) {
                arr[i][j] = '*';
            }
            beg = beg + 2; // 起始下标每次加2
        }

        // 输出梯形区域
        for (int i = 0; i < h; ++i) {
            for (int j = 0; j < 3 * h - 2; ++j) {
                printf("%c", arr[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

叠筐【难】

题目描述:
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机
来完成,得看你的了。
输入: 输入是一个个三元组,分别是:外筐尺寸 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@
   @@@
思路体会

1.scanf %d 会忽略空白字符,scanf %c可以读取空白字符,scanf %c 如果前面有空格,则忽略空白字符

代码表示:
#include <iostream>
using namespace std;

int main() {
    int n; // 外框长度
    char inner, outter; // 里外即内和外的花色
    bool flag = false; // 用于判断是否为第一行

    while (scanf("%d %c %c", &n, &inner, &outter) != EOF) {
        if (flag) {
            cout << endl; // 输出空行
        } else {
            flag = true;
        }

        char pattern[80][80] = {0};
        int x = n / 2; // 第一个点的横坐标
        int y = n / 2; // 第一个点的纵坐标
        char curChar = inner;

        for (int length = 1; length <= n; length += 2, x--, y--) {
            // x和y是起点的下标
            for (int i = x, j = y; i < y + length; ++i) {
                pattern[i][j] = curChar;
            }
            for (int i = x, j = y; j < y + length; ++j) {
                pattern[i][j] = curChar;
            }
            for (int i = x + length - 1, j = y; j < y + length; ++j) {
                pattern[i][j] = curChar;
            }
            for (int i = x, j = y + length - 1; i < x + length; ++i) {
                pattern[i][j] = curChar;
            }

            if (curChar == inner) {
                curChar = outter;
            } else {
                curChar = inner;
            }
        }

        // 多框时需要抹掉四个角
        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) {
            for (int j = 0; j < n; ++j) {
                cout << pattern[i][j];
            }
            cout << endl;
        }
    }

    return 0;
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值