pat乙级真题:1027. 打印沙漏(20)

题目链接

               点击打开链接

题目思路

      由于输入为不大于1000的整数,于是构建一个hourglass[50][99]存储一个沙漏的上半部分。0代表空格,1代表输入的特殊符号。然后计算出需要输出的层数,
        再把数组中的对应部分输出即可。

注意事项

      1 每行只能输出符号前的空格,否则会报格式错误 
          2 记得输出上半部分后,要输出下半部分。倒着来就行。    


#include 
#include 
/****************************************************
*函数功能:创建一个只包含上半部分的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;
}


你可能感兴趣的:(pat乙级真题:1027. 打印沙漏(20))