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

A 输出梯形

题目描述

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

输入

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

输出

h所对应的梯形。

样例输入

5

样例输出

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

代码提交

#include<cstdio>
int main(){
	int h;
	while((scanf("%d",&h)!=EOF)){
		int blank=2*(h-1),n=h;
		for(int i=0;i<n;++i){
			for(int j=0;j<blank;++j) printf(" ");
			blank-=2;
			for(int j=0;j<h;++j) printf("*");
			h+=2;
			printf("\n");
		} 
	}
	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.

样例输入

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)。

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

1)计算字符串长度len;

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

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

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

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

代码提交

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n1,n2,n3,i,j;
	char str[100],ans[40][40];
	gets(str);
	int N=strlen(str);
    n1=(N+2)/3;
    n3=n1;
    n2=N+2-n1-n3;
    for(i=1;i<=n1;i++)
    {
    	for(j=2;j<=n2;j++)
    	{
    		ans[i][j]=' ';
		}
	}
	int index=0;
	for(i=1;i<=n1;i++)
	{
		ans[i][1]=str[index++];
	}
	for(j=2;j<=n2;j++)
	{
		ans[n1][j]=str[index++];
	}
	for(i=n3-1;i>=1;i--)
	{
		ans[i][n2]=str[index++];
	}
	for(i=1;i<=n1;i++)
    {
    	for(j=1;j<=n2;j++)
    	{
    		printf("%c",ans[i][j]);
		}
		printf("\n");
	}

	return 0;
}

C 等腰梯形

题目描述

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

     ****

    ******

   ********

  **********

输入

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

输出

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

样例输入

1
4

样例输出

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

提交代码

#include <stdio.h>
#include <string.h>

int main()
{
    int h;
    int num;
    scanf("%d",&num);

    for(int i = 0;i < num;i++){
        scanf("%d",&h);
        for(int j = 0;j < h;j++){
            for(int k = 0;k < h - j - 1;k++){
                printf(" ");
            }
            for(int k = 0;k < h + 2 * j;k++){
                printf("*");
            }
            for(int k = 0;k < h - j - 1;k++){
                printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

D 沙漏图形 tri2str [1*+]

题目描述

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

输入样例:

3

输出样例:

  * * *
   * * 
    *
   * * 
  * * *

数据规模

1<= n <=50

提交代码

#include <stdio.h>
#include <string.h>

int main()
{
    int num;
    scanf("%d",&num);
    int cnt = num;

    for(int i = 0;i < 2 * num - 1;i++){
        for(int k = cnt;k < num;k++){
            printf(" ");
        }
        for(int j = cnt;j > 0;j--){
            if(j == 1) printf("*\n");
            else{
                printf("* ");   
            }
        }
        if(i < num - 1){
            cnt--;
        }else{
            cnt++;
        } 
    }


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值