-
题目描述:
-
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
-
输入:
-
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
-
输出:
-
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
-
样例输入:
-
11 B A 5 @ W
-
AAAAAAAAA ABBBBBBBBBA ABAAAAAAABA ABABBBBBABA ABABAAABABA ABABABABABA ABABAAABABA ABABBBBBABA ABAAAAAAABA ABBBBBBBBBA AAAAAAAAA @@@ @WWW@ @W@W@ @WWW@ @@@
代码:
#include <stdio.h> int main() { int buf[82][82]; int n,i,j,k; char a,b; bool firstCase = true; while(scanf("%d %c %c",&n,&a,&b)!=EOF) { if(firstCase) firstCase = false; else printf("\n"); for(i=1,j=1;i<=n;i+=2,j++) { int x = n/2+1,y=x; x -= j - 1; y -= j - 1; char c = (j % 2 == 1 ? a : b); for(k=1;k<=i;k++) { buf[x][y+k-1] = c; buf[x+k-1][y] = c; buf[x+i-1][y+k-1] = c; buf[x+k-1][y+i-1] = c; } } if(n!=1) { buf[1][1] = ' '; buf[1][n] = ' '; buf[n][1] = ' '; buf[n][n] = ' '; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%c",buf[i][j]); printf("\n"); } } return 0; }
分析:本题采用先排版,后输出。用一个缓存数组表示要输出的字符序列。阵列的左上角为(1,1),右下角为(n,n)。由内到外完成排版。以每个圈的左上角为参照点。最内圈的参照点为(n/2+1,n/2+1),其次为(n/2+1-1,n/2+1-1).....(n/2+1-j)。最内圈长度为一个字符,其次为3个字符,外圈总比内增加2.
判断使用哪个字符填充: 用j的奇偶性判断。奇为第一个字符,偶为第二个。
注意:
题目要求两个叠框之间需要有一个空行,可转换为:第一个叠框开始时不需要输出空行,其他行都要。设置bool值firstCase。
最外圈四角是空白字符,仅当n!=1时。
样例输出: