叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23853 Accepted Submission(s): 6291
Problem Description
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
Output
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
Sample Input
11 B A5 @ W
Sample Output
AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA
@@@
@WWW@
@W@W@
@WWW@
@@@
Author
qianneng
Source
整体思路就是如图赋值的先对绿色部分赋值后对蓝色部分赋值代码如下。
#include<stdio.h>
int main()
{
int n,change,i,j,L=0;
char b,c,p[100][100],f;
while(scanf("%d %c %c",&n,&b,&c)!=EOF)
{ if(L!=0)printf("\n");//易错点,需要判断他是不是第一组数据如果是且只有一组数据则不换行 否则需要换行。
change=0;//定义一个change来判断是否需要变换花色。
p[n/2][n/2]=b;//单独给出数组最中间的花色。
for(i=n/2-1;i>=0;i--)//利用他的行和列相同长度的特点,从右上角到左下角画对角线,先给对角线上面的数组元素赋值。
{ if(change==0)f=c;
else f=b;
for(j=i;j<=n/2+(n/2-i);j++)
{
p[j][i]=f;//通过改变i,j的位置可以同时双向赋值。同时向右向下,或同是向上向左。
p[i][j]=f;
}
if(change==0)change=1;
else change=0;//每执行完依次复制后改变花色。
}
change=0;
for(i=n/2+1;i<=n-1;i++)//再给对角线下方的数组元素赋值。
{
if(change==0)f=c;
else f=b;
for(j=i;j>=n/2-(i-n/2);j--)
{
p[j][i]=f;
p[i][j]=f;
}
if(change==0)change=1;
else change=0;
}if(n!=1)
{p[0][0]=' ';p[0][n-1]=' ';p[n-1][0]=' ';p[n-1][n-1]=' ';}//如果是n不唯一则最后把四个角全赋值为空格,否则不改变。
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
printf("%c",p[i][j]);
printf("\n");
}
L++;
}return 0;
}