对于一个正整数n(1<=n<=9),输出从1到n的平方的螺旋数组。
输入
多组测试实例。
每个测试实例输入一个整数n(1<=n<=9)。
输出
输出从1到n的平方的螺旋数组。每一行两个数字中间用一个空格隔开。
样例输入 Copy
3
4
样例输出 Copy
1 2 3
8 9 4
7 6 5
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
这题也是参考了佬的代码,比较巧妙的是算出来应该螺旋的圈数,然后每一圈进行向右向下向左向上转,在更新的时候也需要注意边界
#include<iostream>
#include<algorithm>
#include<cstring>
int main()
{
int n;
int a[10][10];
while(scanf("%d",&n)!=EOF){
int count=1,lend=n,kend=n/2,i,j,k;//count记录数,lend记录每次转一个圈时的长度,kend记录转几圈
for(i=0,j=0,k=0;k<kend;k++){
a[i][j]=count++;
for(j++;j<lend;j++){//向右走,长度不超过lend
a[i][j]=count++;
}
for(j--,i++;i<lend;i++){//这时j出界了,应该减一然后向下走,不超过lend
a[i][j]=count++;
}
for(i--,j--;j>=k;j--){//i出界减一后再向左走,他的左边界是k
a[i][j]=count++;
}
for(j++,i--;i>k;i--){//j出界j加一之后向上走,因为向上走的时候最上面的位置已经被占用所以边界是k+1
a[i][j]=count++;
}
i++,j++,lend--;//当转过一圈之后i出界减一,向右走,长度减一
}
if(n%2!=0){//当是奇数的时候说明最后中间还有一个数
a[i][j]=count;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j!=0)printf(" ");
printf("%d",a[i][j]);
}
printf("\n");
}
}
return 0;
}