pat乙級真題:1027. 列印沙漏(20)
阿新 • • 發佈:2019-02-07
題目連結
題目思路
由於輸入為不大於1000的整數,於是構建一個hourglass[50][99]儲存一個沙漏的上半部分。0代表空格,1代表輸入的特殊符號。然後計算出需要輸出的層數, 再把陣列中的對應部分輸出即可。
注意事項
1 每行只能輸出符號前的空格,否則會報格式錯誤 2 記得輸出上半部分後,要輸出下半部分。倒著來就行。
#include <stdlib.h> #include <stdio.h> /**************************************************** *函式功能:建立一個只包含上半部分的50行的沙漏。 * 0 ----空格 * 1-----輸入的符號 ******************************************************/ void create_hourglass(int a[][99]){ int i,j; for (i = 0; i < 50;i++) for (j = i; j <99 - i; j++) a[i][j] = 1; } /************************************************************************** *函式功能:列印沙漏,先列印上半部分,再列印下半部分 *變數: _level-------最大沙漏層數。上半部分的層數。 * _temp--------特殊符號 * _remain------剩下的符號數 ******************************************************************************/ void print_hourglass(int _hourglass[][99],int _level,char _temp,int _remain){ int i,j,k, flag; //沙漏每一行不輸出符號後面的空格。flag == 0時代表符號後面的空格。 //輸出沙漏上半部分 for (j = 50 - _level; j < 50;j++){ flag = 1; for (k = 50 - _level; k < 99 - ( 50 - _level); k++){//99代表沙漏矩陣的列數,50 - _level代表矩陣每行符號後的空格數,不需要輸出,所以減去。 if (_hourglass[j][k]){ flag = 0; printf("%c", _temp); } else{ if (flag) printf(" "); else break; } } printf("\n"); } //輸出沙漏下半部分 for (j = 1; j < _level; j++){ flag = 1; for (k = 50 - _level; k < 99 - (50 - _level); k++){ if (_hourglass[49 - j][k]){ printf("%c", _temp); flag = 0; } else{ if (flag) printf(" "); else break; } } printf("\n"); } printf("%d\n",_remain); } int main(){ int hourglass[50][99] = { 0 }, i, j,k,input,level,remain; char temp; create_hourglass(hourglass); scanf("%d %c",&input,&temp); for (i = 1; input >( (i * i * 2) - 1); i++);//(i * i * 2) - 1代表沙漏上半部分層數為i時,整個沙漏符號總數。直到找到一層的總數不少於input。 if (input == i * i * 2 -1) level = i; else level = i - 1; remain = input - 2 * level * level + 1; print_hourglass(hourglass,level,temp,remain); return 0; }