解法一:模拟输出
#include <iostream>
using namespace std;
int n;
int main() {
while (cin >> n, n) {
for (int i = 1; i <= n; ++i) {
int k = 0;
for (int j = i; j > 0 && k < n; --j, ++k) cout << j << ' ';
for (int j = 2; j <= n && k < n; ++j, ++k) cout << j << ' ';
cout << '\n';
}
cout << '\n';
}
return 0;
}
解法二:矩阵构造
让对角线上的数字为1,每行向两边扩展
#include <iostream>
using namespace std;
const int N = 107;
int n;
int p[N][N];
int main() {
while (cin >> n, n) {
for (int i = 0; i < n; ++i) {
p[i][i] = 1;
for (int j = i - 1; j >= 0; --j) p[i][j] = p[i][j + 1] + 1;
for (int j = i + 1; j < n; ++j) p[i][j] = p[i][j - 1] + 1;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << p[i][j] << ' ';
}
cout << '\n';
}
cout << '\n';
}
return 0;
}