题目:
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
代码:
将一圈看作四个相等的段。如图第一圈长度为4,第二圈为2,每走一圈长度减2。
n为奇数时正中心会空一个,若n为偶数则不会空。
#include<stdio.h>
#include<stdlib.h>
int** build_matrix(int n){ //用来建立一个二维数组
int** matrix = (int**)malloc(n*sizeof(int*));
for(int i=0;i<n;i++){
matrix[i] = (int*)malloc(n*sizeof(int));
}
return matrix;
}
int main(){
int n,i,j,circle,length,count=1; //I,j可视为坐标,circle为圈数,count为输出的数字
i=j=circle=0; //length即把一圈分为四段,每一段的长度
scanf("%d",&n);
int** a = build_matrix(n);
while(circle<n/2){
length = n-1-circle*2;
for(int k=0;k<length;k++){
a[i][j++]=count++; //即a[i][j]=count;j++;count++;
}
for(int k=0;k<length;k++){
a[i++][j]=count++;
}
for(int k=0;k<length;k++){
a[i][j--]=count++;
}
for(int k=0;k<length;k++){
a[i--][j]=count++;
}
circle++;
i=j=circle; //走完一圈,下一圈开始的坐标。
}
if(n%2){ //为奇数时补上正中心的数
a[i][j]=n*n;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}