HDU OJ 2091.空心三角形

Problem Description
把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效果。在设计的过程中,需要给出各种花纹的材料和大小尺寸的三角形样板,通过电脑临时做出来,以便看看效果。
Input
每行包含一个字符和一个整数n(0 Output
每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。


Sample Input

X 2
A 7
@

Sample Output

 X
XXX

      A
     A A
    A   A
   A     A
  A       A
 A         A
AAAAAAAAAAAAA

本题思路:做题之前我们需要明白三角形的规律。
1.首先是每一行的输出规律。假设三角形的高为n,第i行(i从1开始)最开始左边先输出n-i个空格,然后输出一个三角形字符;中间再输出2*(i-1) - 1个空格,然后输出一个三角形字符。这样可以完成除了第一行和最后一行外的所有输出。
2.整个三角形输出规律。三角形分为第一行,中间行,最后一行共三部分组成。如果行数为2,则没有中间行。因为第一行只有一个三角形字符,最后一行全部是三角形字符,而所有的中间行都包含两个三角形字符,所以才按照这样的规律分为三部分。第一行只要运行1中的一半的操作,中间行输出按照1中的规律操作,最后一行直接输出2*n-1个三角形字符。
3.细节处理。题目要求每个输出的三角形之间需要空一行,但是最后一个三角形后面不要空行,否则会出现“Presentation Error”。其实我们遇到的大多数“Presentation Error”的原因都是末尾多输出了一个空格或者换行......所以大家做题的时候一定要注意不要多输出一个空格或者换行符,否则你会抓狂!!!为什么我的输出都是正确的,但就是不能通过呢!!!
其实,很多OJ平台的检查输出是否正确,都是把你的输出内容放在文件里,然后以字符串的形式去和正确答案做对比,一直读到文件的末尾EOF,这个时候末尾多余的那些看不见的字符就会被读出来,然后发现你的输出和正确答案不同,告诉你做错了


代码如下:

#include 
#include 

int main() {
    char c;
    int n, flag = 0;        //flag作为标记,表示当前正在输出第几个空心三角形。如果是第一个,则直接输出三角形,如果不是第一个,则先输出一个换行符,和上面已输出的三角形之间空一行
    int leftSpace,midSpace;     //每行最左边的空格个数,每行两个字母中间的空格个数(只有第2行到n-2行有)
    int i,j;

    while((c = getchar()) != '@') {
        scanf("%d", &n);
        getchar();
        if(flag != 0) {
            printf("\n");
        }
        flag++;

        if(n == 0) {
            continue;
        }

        leftSpace = n - 1;
        midSpace = 1;
        if(n > 0) {                      //如果三角形行数n大于1,输出第一行
            for(i = 0; i < leftSpace; i++) {
                printf(" ");
            }
            printf("%c\n", c);
            leftSpace--;
        }
        if(n > 2) {
            for(i = 2; i < n; i++) {    //如果三角形行数n大于2(最低3行),输出中间的第2到n-1行
                for(j = 0; j < leftSpace; j++) {
                    printf(" ");
                }
                printf("%c", c);
                for(j = 0; j < midSpace; j++) {
                    printf(" ");
                }
                printf("%c\n", c);
                leftSpace--;
                midSpace += 2;
            }
        }
        if(n > 1) {                     //如果三角形行数大于1(最低为2行),输出第n行
            for(i = 0; i < 2 * n - 1; i++) {
                printf("%c", c);
            }
            printf("\n");
        }
    }

    return 0;
}

你可能感兴趣的:(HDU,OJ)