思路1
对于一个n*n的矩阵,依据题目要求,借助数组可以先让其全为1,然后(n-1)*(n-1)全为2,(n-2)*(n-2)全为3
每操作一次(n-k)*(n-k)都可以将之前的数值覆盖,总共出现(n+1)/2个不同的数。确定数组的所有数值后逐个输出。
算法1
#include <iostream>
using namespace std;
int main(){
int n;
while(cin >> n, n){
int m[n][n];
int t=0,i,j;
for(t=1; t<=(n+1)/2; t++){ //元素的值为t
for(i=t-1; i<n-t+1; i++){ //第i行第j列的元素为t
for(j=t-1; j<n-t+1; j++){
m[i][j] = t;
}
}
}
for(int i=0; i<n; i++){ //输出
for(int j=0; j<n; j++){
cout << m[i][j] << ' ';
}
cout << endl;
}
cout << endl;
}
return 0;
}
思路2
参考y总做法,每个元素的值就是它到上下左右四条边的距离的最小值
y总视频讲解:https://www.acwing.com/video/923/
算法2
#include <iostream>
using namespace std;
int main(){
int n;
while(cin >> n, n){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
int left = i+1, right = n-i, up = j+1, down = n-j; //到上下左右四边界的“距离”
int val = min(min(left,right), min(up, down)); //min函数只能两两比较
cout << val << ' ';
}
cout << endl;
}
cout << endl;
}
return 0;
}