• L1-002 打印沙漏 (20分)


    L1-002 打印沙漏 (20分)

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

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

    所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差 (2);符号数先从大到小顺序递减到 (1),再从小到大顺序递增;首尾符号数相等。
    给定任意 (N) 个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

    输入格式:

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

    输出格式:

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

    输入样例:

    19 *
    

    输出样例:

    *****
     ***
      *
     ***
    *****
    2
    

    解题思路:

    关键在于如何计算沙漏的总高度。假设沙漏总共有 (H) 行(根据题目要求,(H) 一定是奇数),我们观察 (frac{H+1}{2}) 行到 (H) 行(共 (frac{H+1}{2}) 行),符号个数为 (1+3+5+ cdots +H=(frac{H+1}{2})^{2}) 个,整个图形的符号个数即为 (2(frac{H+1}{2})^{2}-1=n) 个,那么 (H=2 sqrt{frac{n+1}{2}}-1)。我们需要找到一定的 (N) 下最大的 (H) 值,即 (H_{max}=2 lfloor sqrt{frac{N+1}{2}} floor -1),之后按要求输出即可。
    (color{red}{Ps.})
    1. 每行的 * 后没有多余空格

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n,h;
    char x;
    int main()
    {
        cin>>n>>x;
        h=sqrt((n+1)/2);                        /*这里的h代表上文的(H+1)/2*/
        for(int i=h;i>=1;i--)
        {
            for(int j=1;j<=h-i;j++)cout<<' ';
            for(int j=1;j<=2*i-1;j++)cout<<x;
            cout<<endl;
        }
        for(int i=2;i<=h;i++)
        {
            for(int j=1;j<=h-i;j++)cout<<' ';
            for(int j=1;j<=2*i-1;j++)cout<<x;
            cout<<endl;
        }
        cout<<n-(2*h*h-1)<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    poj 1904 King's Quest
    【BZOJ】1051: [HAOI2006]受欢迎的牛
    hdu 2767 Proving Equivalences
    hdu 3234 Exclusive-OR
    poj 1988 Cube Stacking
    poj 1733 Parity game
    hdu 3047 Zjnu Stadium 带权并查集
    poj 1182 食物链 种类并查集
    HDU 3749 Financial Crisis
    【BZOJ】1046 : [HAOI2007]上升序列
  • 原文地址:https://www.cnblogs.com/LengYun/p/12539189.html
Copyright © 2020-2023  润新知