SDUT4083 Candy Dreamer

Description

题目出处:第九届山东理工大学ACM网络编程擂台赛 正式赛
题目链接:SDUT4083
题目大意:给出三个参数-材料,糖果的直径(也即样例输出中糖果的高度)、长度,输出糖果的图形。
解题思路:可以以行为单位进行分析,推算出材料字符和空格输出的区间表达式;也可以分成左、中、右3块来考虑。emmm…相对而言前一做法好想一点。
AC要点:
1. 行末不要有空格;
2. 每个糖果之间空一行;
3. 多组输入头一输入为字符型的处理。
4. 范围表达式的计算。

AC Codes

//AC 代码1
//来自本题first blood玩家 @参赛昵称好像不限制长
#include <stdio.h>
int main()
{
    char s;
    int a,b,i,j;
    while(~scanf("%c %d %d",&s,&a,&b))
    {
        for(i=0; i<a/2; i++)
        {
            for(j=0; j<b+2*a-2-1; j++)
            {
                if(j>i&&j<a-i-1){printf("  ");}
                else if(j>a+b-2+i&&j<b+2*a-2-i-1) {printf("  ");}
                else printf("%c ",s);

            }
            printf("%c\n",s);
        }
        for(j=0; j<b+2*a-2-1; j++)
        {
            printf("%c ",s);
        }
        printf("%c\n",s);
        for(i=a/2-1; i>=0; i--)
        {
            for(j=0; j<b+2*a-2-1; j++)
            {
                if(j>i&&j<a-i-1){printf("  ");}
                else if(j>a+b-2+i&&j<b+2*a-2-i-1) {printf("  ");}
                else printf("%c ",s);

            }
            printf("%c\n",s);
        }
        printf("\n");
        getchar();    //若是输入有空行或是以\n\r结尾就要GG了
    }

}
//AC 代码2
//改自本题first blood玩家 @参赛昵称好像不限制长

#include <stdio.h>

int main()
{
    char s;
    int a, b, i, j, flag;
    while(~scanf(" %c %d %d",&s, &a, &b))  //%c前加一空格可跳过空白字符
    {
        i = 0;
        flag = 1;    //用于判断转折行
        while (i >= 0) {
            //以行为单位,通过计算判断输出范围
            for(j=0; j < b+2*a-2-1; j++)
            {
                if (j>i && j<a-i-1) { printf("  "); }
                else if (j>a+b-2+i && j<b+2*a-2-i-1) { printf("  "); }
                else printf("%c ", s);
            }
            printf("%c\n",s);   //行末字符单独输出,回车
            //i的变化: 0 -> a/2 -> 0
            if (i == a/2) flag = 0;
            if (flag) i++;
            else i--;
        }
        printf("\n");
    }
    return 0;
}

下面的是标程,分为左中右来考虑了,emmm真看不懂无所谓的。。
Candy_Dreamer

//candy_dreamer.c
//Herman67
//2017.11.8

#include <stdio.h>

int main()
{
    char igr;
    int dia, len;
    int isfirst = 1; //用于判断是否输出空行
    //freopen("data1.in", "r", stdin);  //从文件输入
    //freopen("data1.out", "w", stdout);  //输出到文件

    while (scanf(" %c%d%d", &igr, &dia, &len) != EOF) {
        //判断是否输出空行
        if (isfirst)
            isfirst = 0;
        else printf("\n");
        len -= 2;
        int level = 1;
        int flag = 0;
        while (level) {
            //the first 'bow' part
            int i = 0;
            for (; i < level; i++)
                printf("%c ", igr);
            if (level * 2 < dia) {
                for (i = 0; i < dia - level * 2; i++)
                    printf("  ");
                i = 0;
            }
            else i = 1;
            for (; i < level; i++)
                printf("%c ", igr);

            //the body of candy
            for (i = 0; i < len; i++)
                printf("%c ", igr);

            //the next 'bow' part
            if (len < 0) i = 1;
            else i = 0;
            for (; i < level; i++)
                printf("%c ", igr);
            if (level * 2 < dia) {
                for (i = 0; i < dia - level * 2; i++)
                    printf("  ");
                i = 0;
            }
            else i = 1;
            for (; i < level; i++)
                printf("%c%c", igr,
                (i == level - 1) ? '\n' : ' ');

            //the level's change
            if (!flag && level > dia / 2) flag = 1;
            if (!flag) level++;
            else level--;
        }
    }
    return 0;
}

见有人用 char s[2]; scanf("%s", s);来读入,即利用%s跳过换行回车等空白字符,这也是可行的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值