(本题纯个人做法,思路可能比较混乱)
题目描述
输入整数 N,输出一个 N 阶的回字形二维数组。数组的最外层为 1,次外层为 2,以此类推。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 N,输出一个满足要求的 N阶二维数组。
每个数组占 N行,每行包含 N个用空格隔开的整数。每个数组输出完毕后,输出一个空行。
数据范围
$0\leq N\leq 100$
输入样例
1
2
3
4
5
0
输出样例
1
1 1
1 1
1 1 1
1 2 1
1 1 1
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
算法1
(填充回字形二维数组) $O(n^2)$
根据输入的N值,初始化一个二维数组res,大小为N*N,所有元素初始值为0。通过两层循环,从外向内填充正方形的每一圈,每一圈的值为i+1,i从0开始递增。每一圈分别在四个边界上填充i+1的值,最终形成一个由不同数字组成的正方形。
详细分析
- 用户输入一个整数N,代表一个正方形的边长
- 根据输入的N值,初始化一个二维数组res,大小为N*N,所有元素初始值为0
- 通过两层循环,从外向内填充正方形的每一圈,每一圈的值为i+1,i从0开始递增
- 每一圈分别在四个边界上填充i+1的值,最终形成一个由不同数字组成的正方形
- 打印填充好的正方形
- 继续循环,直到输入的N为0为止,退出程序。
时间复杂度
$O(n^2)$
参考文献
无
C++ 代码
#include <iostream>
using namespace std;
const int MAXN = 105; // 定义常量MAXN为105
int main() {
int N;
while (cin >> N && N != 0) { // 循环输入N的值,当N不为0时执行循环
int res[MAXN][MAXN] = {0}; // 定义二维数组res,初始化为0
for (int i = 0; i < N - 1; i++) { // 外层循环i从0到N-1
for (int j = i; j < N - i; j++) { // 内层循环j从i到N-i
res[i][j] = i + 1; // 在res数组中以正方形的方式填充i+1的值
res[N - i - 1][j] = i + 1; // 在四个边界上填充i+1的值
res[j][i] = i + 1;
res[j][N - i - 1] = i + 1;
}
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j){
cout << res[i][j] << ' '; // 打印填充好的正方形
}
cout << endl;
}
cout << endl; // 输出空行
}
return 0;
}