叠筐

原题链接(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]);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值