題目
/*
1027. 打印沙漏(20)
本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(<=1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最后在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
*/
思路
// 預處理:將 1000 以內所有數目的第一行*號個數和剩余個數求出來
// 之后只要根據輸入的數字輸出即可
// 邊界條件使用線性規划
代碼
#include <cstdio>
#include <iostream>
using namespace std;
int num[1004];
int rest[1004];
void preHandle(){
int sum = 1;
int cnt = 1;
for (int i = 1; i < 1004; ++i) {
if (i >= sum) {
cnt += 2;
sum += cnt*2;
}
num[i] = cnt - 2;
rest[i] = i + cnt * 2 - sum;
}
}
int main(){
preHandle();
int n;
char ch;
cin >> n >> ch;
int size = num[n];
for(int j = 0; j < size;++j){
for (int i = 0; i < size; ++i) {
if ((j <= i && j <= size - 1 - i)||(j >= i && j >= size - 1 - i)) {
cout << ch;
}else if ((j > i && j < size - 1 - i)) {
cout << ' ';
}else{
break;
}
}
cout << endl;
}
cout << rest[n] << endl;
return 0;
}
注意點
- 一行中不能出現多余的空格。
- 不論是否有多余的字符都要顯示出剩余字符。