《算法笔记》3.3小节——入门模拟->图形输出
前言
正文
问题 A: 输出梯形
题目描述
输入一个高度h,输出一个高为h,上底边为h的梯形。
输入
一个整数h(1<=h<=1000)。
输出
h所对应的梯形。
样例输入
5
样例输出
*****
*******
*********
***********
*************
题解:
#include<cstdio>
#include<cstring>
#include<cmath>
int main(){
int h,a;
while(scanf("%d",&h)!=EOF){
a=(h-1)*2+h;
for(int i=0;i<h;i++){
for(int j=0;j<a-(h+2*i);j++){
printf(" ");
}
for(int j=0;j<(h+2*i);j++){
printf("*");
}
printf("\n");
}
}
return 0;
}
/**************************************************************
Problem: 1933
User: 2516085027
Language: C++
Result: 正确
Time:0 ms
Memory:1116 kb
****************************************************************/
问题 B: Hello World for U
题目描述
Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. For example, “helloworld” can be printed as:
h d
e l
l r
lowo
That is, the characters must be printed in the original order, starting top-down from the left vertical line with n1 characters, then left to right along the bottom line with n2 characters, and finally bottom-up along the vertical line with n3 characters. And more, we would like U to be as squared as possible – that is, it must be satisfied that n1 = n3 = max { k| k <= n2 for all 3 <= n2 <= N } with n1 + n2 + n3 - 2 = N.
输入
Each input file contains one test case. Each case contains one string with no less than 5 and no more than 80 characters in a line. The string contains no white space.
输出
For each test case, print the input string in the shape of U as specified in the description.
样例输入
helloworld!
样例输出
h !
e d
l l
lowor
提示
这一题需要解决的问题是将一个字符串写成U字形。拿到这一题的第一映像是U字的写法(可没有茴香豆的“茴”写法多),先是写第一排第一个字符,然后写第二排第一个字符……然后是最后一排,然后是倒数第二排……但在C语言中如果我们要这样写U字形的字符串就需要在数组中操作了。如果是直接输出的话,那只能自上至下一行一行输出。首先是第一行,写出第一个字符和最后一个字符,第二行写出第二个字符和倒数第二个字符……最后是最后一行。需要注意的是除了最后一行输出所有字符,前面每一行只输出两个字符。中间还有空格来隔开每行的两个字符(具体有多少空格,待会计算)。
思路有了,看看具体的要求。字符串的长度是N,n1,n3代表两边每列字符的数目。n2代表最后一行的字符数。题目中给了一个算式:
n1 = n3 = max { k| k <= n2 for all 3 <= n2 <= N } with n1 + n2 + n3 - 2 = N.
仔细研究这个算式,这里的k是不大于n2的,也就是说n1和n3是不大于n2且满足n1+n2+n3=N+2的最大值。那么自然有n1=n3=(N+2)/3,n2=N+2-(n1+n3)。也就是说设side为两边的字符数(包括最后一行的两端),则side=n1=n3=(N+2)/3。设mid为最后一行除去两端的两个字符后剩下的字符数,mid=N-side*2(总长度减去两边的字符数)。同时mid也是我们输出除最后一行外前面所有行需要空出的空格数。
最后如何在第一行输出第一个字符和最后一个字符呢?那自然是str[0]和str[len-1-i](len为字符串的长度,也就是N)。
题解
#include<cstdio>
#include<cstring>
#include<cmath>
int main(){
int len,side,space;
char str[100];
while(scanf("%s",str)!=EOF){
len=strlen(str);
side=(len+2)/3;
space=len-2*side;
for(int i=0;i<side;i++){
if(i!=side-1){
printf("%c",str[i]);
for(int j=0;j<space;j++){
printf(" ");
}
printf("%c\n",str[len-1-i]);
}else{
for(int j=side-1;j<=side+space;j++){
printf("%c",str[j]);
}
printf("\n");
}
}
}
return 0;
}
/**************************************************************
Problem: 1993
User: 2516085027
Language: C++
Result: 正确
Time:0 ms
Memory:1116 kb
****************************************************************/
问题 C: 等腰梯形
题目描述
请输入高度h,输入一个高为h,上底边长为h 的等腰梯形(例如h=4,图形如下)。
****
******
********
**********
输入
输入第一行表示样例数m,接下来m行每行一个整数h,h不超过10。
输出
对应于m个case输出要求的等腰梯形。
样例输入
1
4
样例输出
****
******
********
**********
题解
#include<cstdio>
#include<cstring>
#include<cmath>
int main(){
int h,m,b,a;
while(scanf("%d",&m)!=EOF){
while(m--){
scanf("%d",&h);
b=h+(h-1)*2;
for(int i=0;i<h;i++){
for(int j=(h-1)-i;j>0;j--){
printf(" ");
}
for(int j=h+2*i;j>0;j--){
printf("*");
}
printf("\n");
}
}
}
return 0;
}
/**************************************************************
Problem: 2003
User: 2516085027
Language: C++
Result: 正确
Time:0 ms
Memory:1116 kb
****************************************************************/
问题 D: 沙漏图形 tri2str [1*+]
题目描述
问题:输入n,输出正倒n层星号三角形。首行顶格,星号间有一空格,效果见样例
输入样例:
3
输出样例:
* * *
* *
*
* *
* * *
数据规模 1<= n <=50
题解
#include<cstdio>
#include<cstring>
#include<cmath>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
for(int j=i;j>0;j--){
printf(" ");
}
for(int j=0;j<n-i;j++){
if(j!=n-i-1){
printf("* ");
}else{
printf("*\n");
}
}
}
for(int i=n-2;i>=0;i--){
for(int j=i;j>0;j--){
printf(" ");
}
for(int j=n-i;j>0;j--){
if(j!=1){
printf("* ");
}else{
printf("*\n");
}
}
}
}
return 0;
}
/**************************************************************
Problem: 2506
User: 2516085027
Language: C++
Result: 正确
Time:0 ms
Memory:1116 kb
****************************************************************/
后记
难受,明早又得早起去练车