4. 排版问题

题目来源和说明

2001年清华大学计算机研究生机试真题

题目描述

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

样例

输入:5
输出:
        *****
      *******
    *********
  ***********
*************

简要分析

这道题主要是观察每一行空格和数字的个数。 先看*:第一行h个,第h行则h+(h-1)*2 再看空格:第一行:(h-1)*2个,最后一行0个 分析到这应该for循环就出来了。

C++ 代码

#include<iostream>
using namespace std;

int main() {
	int h;
	while(scanf("%d",&h)!=EOF) {
		int maxLine=h+(h-1)*2; //每一行字符的数目 
		for(int i=1;i<=h;i++) {
			for(int j=1;j<=maxLine;j++) {
				if(j<=maxLine-(h+(i-1)*2)) printf(" "); 
				else printf("*");
			}
			printf("\n");
		}
		return 0;
	}
} 

同类题目

  1. 叠框

简要分析

这个题目感觉挺难的,这里记录一下王道考研的求解方法。首先该排版题目有一个显著特性:不同与上面那道例题,该图形并不具有很强的规律性,特别是该规律(同一圈的字符相同且相邻圈交替)并不与输出顺序(从上到下、从左到右)一致。于是采用了另一种常用的方法:先利用数组完成排版,再进行输出。

利用一个缓存数组来表示将要输出的字符阵列,我们对该字符阵列的坐标做如下规定,规定阵列左上角字符坐标为(1,1),阵列右下角字符坐标为(n,n),其它坐标可以通过这个推理。按照内圈到外圈的顺序来完成图形的排列,在完成每圈排列时,我们需要注意两个要点:首先需要确定该圈左上角的坐标。我们将以这个坐标为参照点来完成该圈的其他字符位置的确定。观察图形得知,最中间圈的左上角字符坐标位置为(n/2+1,n/2+1),次中间圈的左上角字符坐标为(n/2+1-1,n/2+1-1),依次类推即可得到图形中每一个圈的参照点。其次,我们需要计算该圈每边边长长度。这也较为容易,中间圈长度长度为1,次中间圈长度为3,依次类推,外圈总比内圈长度增加2.

C++代码

#include<iostream>
using namespace std;
int outPutBuf[82][82]; //用于预排版的输出缓存

int main() {
    char a,b; //输入两个字符
    int n; //叠框大小
    bool firstCase=true; //是否为第一组数据标志,初始值为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++) { //i用来遍历每圈的圈长度,j用来记录圈数
            int x=n/2+1,y=n/2+1;
            x-=j-1;y-=j-1; //计算每个圈左上角点的坐标
            char c=j%2==1 ? a : b; //计算当前圈要使用那个字符
            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[n][1]=' ';
            outPutBuf[1][n]=' ';
            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;
}

  1. Repeater

https://www.nowcoder.com/questionTerminal/97fd3a67eff4455ea3f4d179d6467de9

简要分析

后补吧~

C++代码

高校夏令营机试训练 文章被收录于专栏

Leetcode题目太多,不知道如何准备高校夏令营?欢迎关注本专栏,和本小白一起准备夏令营吧! 本专题的规划如下: 截止到4月下旬:以王道考研为依托,提供夏令营机考的准备计划,打好基础 截止到5月中旬:以剑指offer进一步加强 本专题的内容如下: 1. 给出题目的在线测试链接,方面您检查代码的正确性 2. 给出题解

全部评论

相关推荐

练习JAVA时长两年半:qps 30000
点赞 评论 收藏
分享
03-10 21:11
武汉大学 运营
学不懂的那种:先天考公圣体
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务