1. 程式人生 > >pat乙級真題:1027. 列印沙漏(20)

pat乙級真題:1027. 列印沙漏(20)

題目連結

題目思路

      由於輸入為不大於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;
}