PAT 1027 打印沙漏


題目

/*
 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;
}

注意點

  1. 一行中不能出現多余的空格。
  2. 不論是否有多余的字符都要顯示出剩余字符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM