解法1
观察可知矩阵中各个点的数字 其实就是到最近一个边界的距离;
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
int n,arr[105][105];
while(cin>>n,n)
{
int left=1,right=n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
arr[i][j]=min(min(i,j),min(n-i+1,n-j+1));
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cout<<arr[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
return 0;
}
解法2
多次(n/2次)遍历数组,一层一层确定元素,left是左上顶点,right是右下顶点
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
int n,arr[105][105];
while(cin>>n,n)
{
int left=1,right=n;
while(left<=right)
{
for(int i=left;i<=right;i++)
{
for(int j=left;j<=right;j++)
{
arr[i][j]=left;
}
}
left++;
right--;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cout<<arr[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
return 0;
}