题目描述
输入n打印回形方阵。
输入
一个整数n (0 < n < 10)
输出
一个方阵,每个数字的场宽为2
样例输入
8
样例输出
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8
8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8
8 7 6 5 5 5 5 5 5 5 5 5 5 5 6 7 8
8 7 6 5 4 4 4 4 4 4 4 4 4 5 6 7 8
8 7 6 5 4 3 3 3 3 3 3 3 4 5 6 7 8
8 7 6 5 4 3 2 2 2 2 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1 1 1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1 1 1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 2 2 2 2 3 4 5 6 7 8
8 7 6 5 4 3 3 3 3 3 3 3 4 5 6 7 8
8 7 6 5 4 4 4 4 4 4 4 4 4 5 6 7 8
8 7 6 5 5 5 5 5 5 5 5 5 5 5 6 7 8
8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8
8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
问题重述
我们需要编写一个程序,输入一个整数n(0 < n < 10),输出一个回形方阵。回形方阵的特点是:
-
方阵的尺寸为(2n + 1) × (2n + 1)。
-
方阵中的数字从外向内递减,最外层为n,向内依次为n-1, n-2, ..., 0。
-
每个数字的场宽为2,即输出时每个数字占两个字符的位置,不足的用空格补齐。
示例分析
以样例输入n=8为例,输出的方阵尺寸为17×17(因为2×8 + 1 = 17)。方阵的最外层是8,向内一层是7,依此类推,直到中心为0。
解题思路
要生成这样的回形方阵,可以按照以下步骤进行:
-
确定方阵的尺寸:尺寸为(2n + 1) × (2n + 1)。
-
确定每一层的数字:从外向内,数字依次为n, n-1, ..., 0。
-
填充方阵:
-
对于方阵中的每一个位置(i, j),其值为max(|i - n|, |j - n|),其中n是输入的数字。
-
这里的|i - n|和|j - n|表示当前位置到中心的行距离和列距离的最大值。
-
然后,用n减去这个最大值得到当前位置的数字。
-
-
格式化输出:每个数字占两个字符的宽度,右对齐,不足的用空格补齐。
具体步骤
-
输入n:读取用户输入的整数n。
-
计算方阵尺寸:size = 2n + 1。
-
生成方阵:
-
遍历每一行i(从0到size - 1)。
-
遍历每一列j(从0到size - 1)。
-
计算当前位置的数字:value = n - max(|i - n|, |j - n|)。
-
-
输出方阵:
-
对于每个数字,使用printf("%2d", value)或类似方法确保场宽为2。
-
代码实现
以下是C++的实现代码:
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main() {
int n;
cin >> n;
int size = 2 * n + 1;
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
int min_dist = min({i, j, size - 1 - i, size - 1 - j});
int value = n - min_dist;
cout << setw(2) << value;
}
cout << endl;
}
return 0;
}