叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25100 Accepted Submission(s): 6634
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@ @@@
Author
qianneng
Source
Recommend
linle | We have carefully selected several similar problems for you: 2072 2091 1096 1093 1092
Statistic | Submit | Discuss | Note
心得:1、对称图形,分割考虑,每部分都是对称的,只考虑它对称的部分,然后将其他部分转换为对称部分来考虑;
2、考虑特殊情况,当n==1时,只输出一个。
3、格式问题,注意题目描述,是每个叠筐之间,所以结尾不要输出空格;
4、综上,做题时1,2,3考虑到了,4没考虑到。
#include<bits/stdc++.h>
using namespace std;
char a[120][120];
int main(void)
{
int n,i,j,t1,t2,t3,t4,tp,pt=0;
char c1,c2;
while(~scanf("%d %c %c",&n,&c1,&c2))
{
if(pt) printf("\n");
pt++;
if(n==1)
{
printf("%c\n",c1);
continue;
}
tp=(n+1)/2;
if(tp%2==1) swap(c1,c2);
memset(a,c2,sizeof(a));
tp=(n+1)/2;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i%2==0&&(i+j==n+1||i==j)) a[i][j]=c1;
if(j%2==0&&(i+j==n+1||i==j)) a[i][j]=c1;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>=tp) t1=n+1-i;else t1=i;
if(j>=tp) t2=n+1-j;else t2=j;
if(t1%2==0&&t2>=t1) a[i][j]=c1;
if(t2%2==0&&t1>=t2) a[i][j]=c1;
}
}
a[1][1]=a[n][n]=' ';
a[1][n]=a[n][1]=' ';
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) printf("%c",a[i][j]);
printf("\n");
}
}
return 0;
}