《算法笔记》3.3小节——入门模拟->图形输出

目录

问题 A: 输出梯形

问题 B: Hello World for U

问题 C: 等腰梯形

问题 D: 沙漏图形 tri2str [1*+]


问题 A: 输出梯形

题目描述

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

输入

一个整数h(1<=h<=1000)。

输出

h所对应的梯形。

样例输入

5

样例输出

        *****
      *******
    *********
  ***********
*************

题解

#include <cstdio>
#include <string.h>
int main(){
	int h;
	while(scanf("%d", &h) != EOF){
		int temp;//暂存h
		temp = h;
		int blank;//空格数
		int i, j, k;
		for(i = 0; i < h; i++){
			blank = 2 * temp - 2;//当前行的空格数
			for(j = 0; j < blank; j++){
				printf(" ");
			}
			for(k = blank; k < 3 * h - 2; k++){//当前行剩下的星号数
				printf("*");
			}
			printf("\n");
			temp--;//更新下一行
		}
	}
	return 0;
}

问题 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.

 

样例输入

<span style="color:#333333">helloworld!</span>

样例输出

<span style="color:#333333">h   !
e   d
l   l
lowor
</span>

提示

这一题需要解决的问题是将一个字符串写成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)。

 

于是问题完美解决,步骤如下:

 

1)计算字符串长度len;

 

2)计算两边的字符数side=(len+2)/3;

 

3)计算最后一行中间的字符数(前面每行中间的空格数);

 

4)输出每行相应的字符。

 

由于该题目不难,也没有什么需要特别注意的,我也就不写注意点了。具体细节详见参考代码。

题解

#include <cstdio>
#include <string.h>
#define Max 81
int main()
{
    char str[Max];
    gets(str);
    int len = strlen(str);//字符串长度
    int n1, n2, n3;
    int i, j; 
    n1 = n3 = (len + 2) / 3;
    n2 = (len + 2 ) / 3 + (len + 2) % 3;
    for(i = 0; i < n1 - 1; i++){
        printf("%c", str[i]);
        for(j = 0; j < n2 - 2; j++){
        	printf(" ");
		}
        printf("%c\n", str[len - 1 - i]);
    }
    for(; i < n1 + n2 - 1; i++){
    	printf("%c", str[i]);//最后一行
	}
    printf("\n");
    return 0;
}

问题 C: 等腰梯形

题目描述

请输入高度h,输入一个高为h,上底边长为h 的等腰梯形(例如h=4,图形如下)。

   ****

  ******

 ********

**********

输入

输入第一行表示样例数m,接下来m行每行一个整数h,h不超过10。

输出

对应于m个case输出要求的等腰梯形。

样例输入

1
4

样例输出

   ****
  ******
 ********
**********

题解

#include <cstdio>
#include <string.h>
int main()
{
    int m;
    scanf("%d", &m);
    while(m--){
    	int h;
    	scanf("%d", &h);
    	int i, j;
    	for(i = 0; i < h; i++){
    		for(j = 0; j < h - i - 1; j++){//当前行的空格数
    			printf(" ");
			}
			for(j = h - i - 1; j < 2 * h + i - 1; j++){//当前行的星号数
    			printf("*");
			}
			printf("\n");
		}
	}
    return 0;
}

问题 D: 沙漏图形 tri2str [1*+]

题目描述

问题:输入n,输出正倒n层星号三角形。首行顶格,星号间有一空格,效果见样例 
输入样例: 

输出样例:

* * *
 * * 
  *
 * * 
* * *

数据规模 1<= n <=50 

题解

下面代码排版错乱,直接复制即可!

#include <cstdio>
#include <string.h>
int main()
{
    int n;
    while(scanf("%d", &n) != EOF){
    	int i, j;
    	for(i = 0; i < n; i++){//倒三角形
	    	for(j = 0; j < i; j++){
	    		printf(" ");
			}
			for(j = 0; j < n - i; j++){
	    		printf("*");
	    		if(j != n - i - 1){
	    			printf(" ");
				}
			}
			printf("\n");
		}
		for(i = n - 2; i >= 0; i--){//正三角形
	    	for(j = 0; j < i; j++){
	    		printf(" ");
			}
			for(j = 0; j < n - i; j++){
	    		printf("*");
	    		if(j != n - i - 1){
	    			printf(" ");
				}
			}
			printf("\n");
		}
	}
    return 0;
}
发布了84 篇原创文章 · 获赞 97 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wyatt007/article/details/103845165