方法一
像蛇形排列,一圈一圈的从上到右到下到左
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
while(cin>>n,n){//要使当n为零就停下,while循环这么写,cin后还要标记一下
int a[n][n];
int l=0,r=n-1,u=0,d=n-1,m=1;
while(l<=r||u<=d){//这里要注意,循环只有左边不超过右边且上不超过下才能运行
for(int i=l;i<=r&&u<=d;i++) a[u][i]=m;
u++;
for(int i=u;i<=d&&l<=r;i++) a[i][r]=m;
r--;
for(int i=r;i>=l&&u<=d;i--) a[d][i]=m;
d--;
for(int i=d;i>=u&&l<=r;i--) a[i][l]=m;
l++;
m++;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
方法二
当n为单数时,找到中心点;为双数时,拟定一个中心点,每一圈的行和列的最大值距离中心的距离一样
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
while(cin>>n,n){
int a[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(n%2!=0)
a[i][j]=(n+1)/2-max(abs(n/2-i),abs(n/2-j));
else a[i][j]=(n+1)/2.0-max(abs((n-1)/2.0-i),abs((n-1)/2.0-j));
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
括号多容易理错