例2.5 叠框
分析:
- 输入的整数不超过80
- 输入的是奇数 (n=2*i+1)
- 图案打印采用二维数组
- 中心点为第一个字符 (i+1, j+1)=第一个字符
- 从中心点往外一圈字符交替扩散
- 图案问题 -> 二维数组 + 数字规律
// 每次填充
void paint(int i, char pattern[80][80], int j, char c) {
// 1. 上边
for (int k = i - j; k <= i + j; ++k) {
pattern[i-j][k] = c;
}
// 2. 下边
for (int k = i - j; k <= i + j; ++k) {
pattern[i+j][k] = c;
}
// 3. 左边
for (int k = i - j; k <= i + j; ++k) {
pattern[k][i-j] = c;
}
// 4. 右边
for (int k = i - j; k <= i + j; ++k) {
pattern[k][i+j] = c;
}
}
int main(){
// 图案打印问题 -> 二维数组
int n;
char a, b; // 第一个 和 第二个字符
while(EOF != scanf("%d %c %c", &n, &a, &b)) {
char pattern[80][80] = {0};
printf("%d %c %c\n", n, a, b);
int i = (n - 1) >> 1;
// 1. 中心点
pattern[i][i] = b;
// 3. 填充内容
for (int j = 1; j <= i; ++j) { // j 代表第几次涂
// 中心点i 涂pattern 第j次涂 本次涂哪个字母
paint(i, pattern, j, j%2 == 1 ? a : b);
}
// 2. 四角
pattern[0][0] = ' ';
pattern[0][n-1]=' ';
pattern[n-1][0]=' ';
pattern[n-1][n-1]=' ';
// 4. 打印结果
for (int j = 0; j < n; ++j) {
printf("%s\n", pattern[j]);
}
printf("\n");
}
}
有账号的同学可以复制粘贴 ac 一下~

