题目描述
输入整数N,输出一个N阶的二维数组。
数组的形式参照样例。
样例
输入样例:
1
2
3
4
5
0
输出样例:
1
1 2
2 1
1 2 3
2 1 2
3 2 1
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
1 2 3 4 5
2 1 2 3 4
3 2 1 2 3
4 3 2 1 2
5 4 3 2 1
算法1
(找规律) $O(n^2)$
按照如图顺序填充矩阵
时间复杂度
参考文献
C++ 代码
#include <iostream>
using namespace std;
const int N = 110;
int a[N][N];
int n;
int main(){
while (scanf("%d", &n), n){
for (int i = 1; i <= n; i ++ )
for (int j = i, k = 1; j <= n; j ++ , k ++ )
a[i][j] = k, a[j][i] = k;
for (int i = 1; i <= n; i ++ ){
for (int j = 1; j <= n; j ++ )
cout << a[i][j] << ' ';
cout << endl;
}
cout << endl;
}
}
算法2
(暴力枚举) $O(n^2)$
考虑一行一行进行枚举,
1.------->
2.------->
3.------->
可以根据对角线填写相应数字,从对角线开始往前递减, 对角线往后又开始递增。
时间复杂度
参考文献
C++ 代码
#include <iostream>
using namespace std;
const int N = 110;
int n, a[N][N];
int main(){
while (scanf("%d", &n), n){
for (int i = 1; i <= n; i ++ ){
for (int j = i; j >= 1; j -- ) cout << j << ' ';
for (int j = i + 1; j <= n; j ++ ) cout << j - i + 1 << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}
算法3
观察矩阵,可以发现,每个数字都是$(j - i) + 1$
代码
#include <iostream>
using namespace std;
int n;
int main(){
while (cin >> n, n){
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= n; j ++)
cout << abs(i - j) + 1 << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}
写的很详细哦!棒棒的
感谢支持。