n*n的螺旋矩阵形如:
当i=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 |
当i=6时:
1 | 2 | 3 | 4 | 5 | 6 |
20 | 21 | 22 | 23 | 24 | 7 |
19 | 32 | 33 | 34 | 25 | 8 |
18 | 31 | 36 | 35 | 26 | 9 |
17 | 30 | 29 | 28 | 27 | 10 |
16 | 15 | 14 | 13 | 12 | 11 |
可以构建一个二维数组依次保存
对于每一层的坐标情况
(k,k)———①—————(k,n-1-k)
| |
④ ②
| |
(n-1-k,k)———③———(n-1-k,n-1-k)
二维数组a[i][j]
每环绕一层k++,依次循环①,②,③,④,直到k=n/2
①:i=k,j<n-1-k
②:j=n-1-k,i<n-1-k
③:i=n-1-k,j>k
④:j=k,i>k
若n是奇数,正中间的无法遍历到,所以最后需要补上
源代码如下:
#include<stdio.h>
void main(void){
int a[50][50];
int i=0,j=0,k=0,n,p,s=1;
while(n<1 || n>50){
printf("Please input the lines:");
scanf("%d",&n); //矩阵的行数
}
p=n/2;
while(k<p){ //K是层数,依次递进
i=k;
j=k;
while(j<n-1-k)
a[i][j++]=s++;
while(i<n-1-k)
a[i++][j]=s++;
while(j>k)
a[i][j--]=s++;
while(i>k)
a[i--][j]=s++;
k++;
}
if(n%2==1) //n是奇数的时候补齐最后一个
a[p][p]=s++;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n");
}
}