-
题目描述:
-
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
-
输入:
-
输入是一个个的三元组,分别是,外筐尺寸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>
//本题的解决方法:先完成排版,再进行输出
//先将要输出的结果存储在二维数组中,再输出数组
char result[82][82];
int main()
{
int firstLine = 1;
int n;
char a,b;
//程序按照最内圈到最外圈的顺序来完成图形的排列
//在完成每圈排列时要注意两点:首先需要确定该圈左上角的坐标
//最中间圈的左上角字符坐标为(n/2+1,n/2+1),次中间圈的左上角字符坐标为(n/2+1-1,n/2+1-1),依次类推
// 其次需要计算该圈每边的边长
//中心圈长度为1,次中心圈长度为3,依次类推
//明确每圈用哪个字符填充,最中间圈用第一个字符,次中间圈用第二个字符,次次中间圈用第一个字符,依次周期循环。
while(scanf("%d %c %c",&n,&a,&b) != EOF){
if(firstLine != 1){ //处理题目中“叠框与叠框之间应有一行间隔”的要求
printf("\n"); //除了在第一个叠框输出前不多输出一个空行外,在其他每一个叠框输出前都要额外输出一个空行
}else{
firstLine = 0;
}
int middle = (n/2)+1;//计算整个图形的中间行号
int x = middle; //x,y初始化为最中间圈左上角的坐标(事实上最中间圈也只占一个字符)
int y = middle;
for(int i =1,j = 1;j<=middle;j++,i = i+2){ //行数为n的图形,共有(n/2+1)圈,j是第几圈的计数器 i是第j圈(每圈都是正方形)的边长
char temp = j%2==0?b:a; //最中间圈--j为1--第一个字符---也就是说j为奇数是第一个字符,j为偶数是第二个字符
x = middle-j+1; //计算每圈左上角的坐标
y = middle-j+1;
for(int k =0;k <i;k++){ //填充每圈(每一圈只填充边界)
if(k ==0 || k == i-1){ //若为该圈的第一行或最后一行---则都填满
for(int t = 0;t <i;t++){
result[x+k][y+t]=temp;
}
}else{ //若非该圈的第一行或最后一行---则只在该行的第一个和最后一个位置填上相应字符
result[x+k][y]=temp;
result[x+k][y+i-1]=temp;
}
}
}
if(n != 1){ //在n大于1的情况下,每个输出图形最外圈的四个角为空
result[1][1] = ' ';
result[n][n] = ' ';
result[1][n] = ' ';
result[n][1] = ' ';
}
for(int i = 1;i <=n;i++){
for(int j =1;j <=n;j++){
printf("%c",result[i][j]);
}
printf("\n");
}
}
return 0;
}
注明---该博客为本人王道的学习笔记记录,博客中有些总结是引用王道机试一书的。