叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24600 Accepted Submission(s): 6475
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
杭电oj是个好地方,这道题,提交了多次,全是细节,如:两个测试数间有一空行,这个比较特殊,头一次见,每一组测试数据都可能是最后一组测试数据,(最后一组数据后不空行),有技巧。
我提交多次,发现当n==1时,没输出,改了之后,accepted了,好开心。
更有大佬用数组做,觉得数组有些麻烦,不是不能写,直接输出不就好了吗?
我冗长的代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n,o=0,t=0;
char a,b;
while(~scanf("%d %c %c",&n,&a,&b))
{
getchar();
char c=a;
if(o++)
{
printf("\n");
}
if(n==1)
{
printf("%c\n",a);continue;
}
if((n/2)%2==0)
{
a=b;
b=c;
}
int i,j,k;
//printf("%c %c\n",a,b);
printf(" ");
for(i=1;i<=n-2;i++)
printf("%c",b);
printf(" \n");
for(i=2;i<=n/2+1;i++)
{
for(j=1;j<i;j++)
if(j%2==0)
printf("%c",a);
else
printf("%c",b);
//printf("%d %d",i,j);
for(j=1;j<=abs(n-2*i+2);j++)
{
if(i%2==0)
printf("%c",a);
else
printf("%c",b);
}
//printf("%d %d",i,j);
for(j=1;j<i;j++)
{
//printf("%d",j);
if(i%2!=0)
{
if(j%2==0)
printf("%c",b);
else
printf("%c",a);
}
else
{
if(j%2==0)
printf("%c",a);
else
printf("%c",b);
}
}
printf("\n");
}
for(i=n/2+2;i<n;i++)
{
for(j=1;j<=n-i;j++)
{
if(j%2==0)
printf("%c",a);
else
printf("%c",b);
}
for(j=1;j<=abs(2*i-n);j++)
{
if(i%2==0)
printf("%c",a);
else
printf("%c",b);
}
for(j=1;j<=n-i;j++)
{
if(i%2==0)
{
if(j%2==0)
printf("%c",a);
else
printf("%c",b);
}
else
{
if(j%2==0)
printf("%c",b);
else
printf("%c",a);
}
}
printf("\n");
}
printf(" ");
for(i=1;i<=n-2;i++)
printf("%c",b);
printf(" \n");
//getchar();
}
return 0;
}
再贴一个简洁的代码:
#include<iostream>
using namespace std;
int main(){
int n,t=0;
char a[85][85],b,c;
while(cin>>n>>b>>c){
if(t++)
cout<<endl;
if(n/2%2==0)
swap(b,c);
for(int k=0; k<n; k++)
for(int i=k; i<n-k; i++)
for(int j=k; j<n-k; j++){
if(k%2)
a[i][j]=b;
else
a[i][j]=c;
}
if(n!=1)
a[0][n-1]=a[0][0]=a[n-1][0]=a[n-1][n-1]=' ';
for(int i=0; i<n; i++){
for(int j=0; j<n; j++)
cout<<a[i][j];
cout<<endl;
}
}
return 0;
}