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.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
跳过换行回车等空白字符,这也是可行的。