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),阵列右下角字符坐标为(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;
}
- Repeater
https://www.nowcoder.com/questionTerminal/97fd3a67eff4455ea3f4d179d6467de9
简要分析
后补吧~
C++代码
Leetcode题目太多,不知道如何准备高校夏令营?欢迎关注本专栏,和本小白一起准备夏令营吧! 本专题的规划如下: 截止到4月下旬:以王道考研为依托,提供夏令营机考的准备计划,打好基础 截止到5月中旬:以剑指offer进一步加强 本专题的内容如下: 1. 给出题目的在线测试链接,方面您检查代码的正确性 2. 给出题解