原题链接(hdoj 2074):http://acm.hdu.edu.cn/showproblem.php?pid=2074
叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
Output
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
Sample Input
11 B A
5 @ W
Sample Output
AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA
@@@
@WWW@
@W@W@
@WWW@
@@@
这个题除了坑爹我没什么话想说了, 注意三点:1. 中心花色和外围花色的判断;2. 右边两个角不是没有东西的,那是空格(坑死!);答案输出格式。
另外这个题给了我一个启发:以前这种画图题都是一行行一个个字符打输出的,这道题思路是用的是字符串输出, 先给出一个大图,然后一点点修改。
AC代码:
#include<stdio.h>
#include<string.h>
void swap(char *a, char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
main()
{
int n;
char ch1, ch2, str[100][100], k = 0;
while(scanf("%d %c %c", &n, &ch1, &ch2) != EOF)
{
if(k)
printf("\n");
k = 1;
if(n == 1)
{
printf("%c\n", ch1);
continue;
}
memset(str, '\0', sizeof(str));
if((n / 2 + 1) % 2 == 0)
swap(&ch1, &ch2);
for(int i = 0; i < n ;i++)
if(i % 2)
memset(str[i], ch2, sizeof(char) * n);
else
memset(str[i], ch1, sizeof(char) * n);
for(int i = 0; i < n / 2 + 1; i++)
{
if(i == 0 || i == n - 1)
{
str[0][0] = ' ';
str[0][n - 1] = ' ';
str[n - 1][0] = ' ';
str[n - 1][n - 1] = ' ';
continue;
}
if(i % 2)
for(int j = 0; j < n / 2; j++)
{
if(!(j % 2) && j < i)
{
str[i][j] = ch1;
str[i][n - 1 - j] = ch1;
str[n - i - 1][j] = ch1;
str[n - i - 1][n - 1 - j] = ch1;
}
}
else
for(int j = 0; j < n; j++)
{
if(j % 2 && j < i)
{
str[i][j] = ch2;
str[i][n - 1 - j] = ch2;
str[n - i - 1][j] = ch2;
str[n - i - 1][n - 1 - j] = ch2;
}
}
}
for(int i = 0; i < n ;i++)
puts(str[i]);
}
}