演算法學習之路|列印沙漏

kissjz發表於2018-02-26

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印

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

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求列印出的沙漏能用掉儘可能多的符號。

輸入格式

輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。

輸出格式

首先列印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:
19 *
輸出樣例:

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

2
解題思路

先求出多餘幾個以及可以成的行數

在把影像分為上三角形,和下梯形即可。

#include<iostream>
using namespace std;
int line,yushu;

void a(int n){//知道符號的數量,求可以成的行數(不是真正的行數邏輯上的行數)和剩餘的數
    int sum=1;
    if(n==1){
        line=1;
        yushu=0;
    }
    for(int i=2;;i++){//從第二行開始
        sum+=4*i-2;
        if(sum>n){
            line=i-1;
            yushu=n-(sum-(4*i-2));
            return;
        }
    }
}
int main(){
    int n;
    char ch;
    cin>>n>>ch;
    a(n);
    for(int i=line;i>0;i--){
        for(int j=i;j<line;j++){
            cout<<" ";
        }
        for(int j=0;j<2*i-1;j++){
            cout<<ch;
        }
        cout<<endl;
    }
    for(int i=2;i<=line;i++){
        for(int j=i;j<line;j++){
            cout<<" ";
        }
        for(int j=0;j<2*i-1;j++){
            cout<<ch;
        }
        cout<<endl;
    }
    cout<<yushu;
    
}


相關文章