zoukankan      html  css  js  c++  java
  • 打印沙漏

    7-1 打印沙漏 (20 分)
    本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印





    所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

    给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

    输入格式:
    输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

    输出格式:
    首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

    输入样例:
    19 *
    输出样例:





    2

    一,实验代码:

    #include<stdio.h>
    int main()
    {
    	int N,b=1,remainder,count=0,count_1=0,ce=0;
    	double hang=1,lie;
    	int a,c,point,point_1;
    	char op;
    	
    	scanf("%d %c",&N,&op); 
    	for(;N-b>0;)
    	{
    		hang+=2;
    		b=b+hang*2;
    		count++;
    	}
    	if(N==b)
    		remainder=0;
    	else
    	{
    		b=b-hang*2;
    		count--;
    		hang-=2;
    		remainder=N-b;
    	}
    	lie=hang;
    	point=hang-count;
    	point_1=point-1;
    	for(a=1;a<=hang/2+0.5;a++)
    	{
    		for(c=1;c<=lie;c++)
    		{
    			if(a==1)
    				printf("%c",op);
    			if(a>1&&c<=point-point_1||c>point+point_1)
    				{
    					printf(" ");
    					ce++;
    				}
    			if (a>1&&c>point-point_1&&c<point+point_1)
    				printf("%c",op);
    			if(c==lie)
    				printf("
    ");
    		}
    		count_1++;
    		lie-=1;
    		if(a>=2)
    			point_1-=1;
    	}
    	a=a-2;
    	point_1+=2;
    	lie=lie+count_1;
    	for(;a>=1;a--)
    	{
    		for(c=1;c<=lie;c++)
    		{
    			if(a==1)
    				printf("%c",op);
    			if(a>1&&c<=point-point_1)
    				{
    				printf(" ");
    				ce++;
    				}
    			if (a>1&&c>point-point_1&&c<point+point_1)
    				printf("%c",op);
    			if(c==lie)
    				printf("
    ");
    			}
    	if(a>=2)
    		point_1+=1;
    	}
    	printf("%d
    ",remainder);
    
    	return 0;
    }
    
    

    二,设计思路:

    一种思路就是将代码分为两大部分,第一大部分主要用来算出参数N最少需要多少数目的符号,多少行和剩余多少符号没用,其数目会分别储存至参数b,hang和remainder中,这部分还有其他的一些参数如point,point_1等,这些主要用于第二大部分控制符号输出规律。第二大部分用来输出图像,这部分代码又可以分成两小部分我将其分为A,B两部分。A部分用来输出漏斗的上半部分,B部分用来输出漏斗的下半部分,然后都用for语句嵌套循环,外循环控制行,内循环控制列。A,B部分的内循环中用在if语句中所加入的算式来判断该行的每一列应该输出符号还是空格。当图形输出完毕后,在图形下方输出参数remainder的值即剩余符号数即可。
    有一个注意的小细节,就是题中给出的输出案例,图形只有左侧存在空格,而右侧则不存在空格,即在输出完每行需要输出的符号后就跳转到下一行继续输出,且每一行所需要输出的符号数是呈一定规律变化的。因此需要添加相应的参数来控制符号输出的规律,我所添加的相应参数就是point和point_1。

  • 相关阅读:
    区间DP中的环形DP
    hdu 5251 包围点集最小矩形 ***
    hdu 4858 水题
    hdu 3530 单调队列 **
    hdu 3338 最大流 ****
    hdu 2732 最大流 **
    hdu 5233 离散化 **
    hdu 3555 数位dp *
    zoj 3469 区间dp **
    2015 安徽程序设计省赛总结
  • 原文地址:https://www.cnblogs.com/noacgnnolife/p/10281829.html
Copyright © 2011-2022 走看看