例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 一下~