题目描述:
把一个个大小差一園的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机完成,得看你的了。
输入:
输入是一个个三元组。分別是:外筐尺寸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@
@@@
题目分析
采用数组填充法:
- 提前分配好固定大小的数组
- 将一圈填充视作一次循环,确定每次循环的起点位置,即最左上坐标(loc,loc),以及每圈的长度length
- 从最中心处开始由内向外一圈一圈进行数组填充
- 切记,四个角并无填充,在数组中去掉,或者打印时避免
#include <stdio.h>
//叠框问题
int main(){
int n;
char a, b;//a在内
while(scanf("%d %c %c", &n, &a, &b) != EOF){
//输入个数未知,用循环接受
printf("n=%d,a=%c,b=%c\n", n, a, b);
char pic[80][80] = {
0}; //每一个元素都被初始化为\0
int flag = 1; //控制字符为a或b,初始为a,每层交替变换
char ch;
for(int length = 1, loc = n/2;length <= n;length += 2, loc--){
//更新每一圈的起始位置(loc, loc)和长度
if(flag == 1){
ch = a;
}else{
ch = b;
}
for (int i = 0; i < length; i++) {
//上下边框
pic[loc][loc+i] = ch;
pic[loc+length-1][loc+i] = ch;
}
for (int i = 1; i < length - 1; i++){
//左右边框
pic[loc+i][loc] = ch;
pic[loc+i][loc+length-1] = ch;
}
flag = flag*(-1); //改变符号标志
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if((n!=1)&&(((i == 0)&&(j == 0)) || ((i == n-1)&&(j == 0)) || ((i == 0)&&(j ==n-1)) || ((i ==n-1)&&(j == n-1)))){
//四个角不进行输出
printf(" ");
}else{
printf("%c", pic[i][j]);
}
}
printf("\n");
}
}
return 0;
}
结果展示