1. 程式人生 > 其它 >1027. 列印沙漏(20)-PAT乙級真題

1027. 列印沙漏(20)-PAT乙級真題

技術標籤:團體程式設計天梯賽-練習集PAT乙級

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

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

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

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

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

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

輸入樣例:

19 *

輸出樣例:

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

ac程式碼:

#include<iostream>
using namespace std;
int main()
{
	int n,row,p;char ch;//row是行數,p是surplus剩餘量. 
	cin>>n>>ch;
	while(2*row*row+4*row+1<n)
		row++;//以n=19為例,while結束後i=3,上三角和下三角都有三行.
	row--,p=n-(2*row*row+4*row+1);//計算剩餘量 
	for(int
i=0;i<=row;i++) { for(int j=0;j<i;j++)//先輸出空格:空格數和i相同 printf(" "); for(int j=2*i;j<row*2+1;j++)//輸出符號,符號數固定為 (row*2+1)(常量)-(2*i)(變數) cout<<ch; puts("");//換行 } for(int i=row-1;i>=0;i--) //已經輸出上半部分的情況下,如何快速輸出下半部分: { //其他條件不變,最外層迴圈條件i倒轉即可 for(int
j=0;j<i;j++) printf(" "); for(int j=2*i;j<row*2+1;j++) cout<<ch; puts(""); } printf("%d",p);//輸出剩餘量 }

後記
歸類:圖形題,規律題
同類題:
列印菱形圖案

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n/2;i++)
	{
		for(int j=i;j<=n/2;j++)
			printf("  ");
		for(int j=1;j<=2*i-1;j++)
			printf("* ");
		puts("");
	}
	for(int i=n/2+1;i>=1;i--)
	{
		for(int j=i;j<=n/2;j++)
			printf("  ");
		for(int j=1;j<=2*i-1;j++)
			printf("* ");
		puts("");
	}
}

z字形掃描
用到了填充的思想