昨天在看python,突然群里有人问回旋数字的算法,然后就把手头上的python丢到了一边,做起了题.(囧)
说一下我的思路吧,就是将矩阵分成若干圈,每一圈看成上下左右四个数列。
圈数以及数列长度如何确定?
很简单,圈数是n/2+n%2,数列长度是n-1-count*2(count表示的是第几圈)
下面贴上我的代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <memory.h> 4 #define max 100 5 int n;//给定的参数 6 int cnt;//第几圈 7 int all;//总圈数 8 int len;//数列的长度 9 int startindex;//每个数列开始的索引 10 int start;//每圈的起始数 11 int matrix[max][max];//存储数 12 13 int main(void) 14 { 15 memset(matrix,0,sizeof(matrix)); 16 scanf("%d",&n); 17 all = n/2+n%2; 18 cnt = 1; 19 start =0; 20 while (cnt<=all) 21 { 22 23 int i; 24 len = n-1-((cnt-1)<<1); 25 //cnt++; 26 for (startindex=cnt,i=1;i<=len;i++) 27 { 28 matrix [cnt][startindex++]=start+i; 29 // printf ("%d ",matrix[cnt][startindex-1]); 30 } 31 for (startindex=cnt,i=1;i<=len;i++) 32 { 33 matrix[startindex++][n-cnt+1]=start+len+i; 34 } 35 for (startindex=n-cnt+1,i=1;i<=len;i++) 36 { 37 matrix[n-cnt+1][startindex--]=start+len*2+i; 38 } 39 for (startindex=n-cnt+1,i=1;i<=len;i++) 40 { 41 matrix[startindex--][cnt]=start+len*3+i; 42 } 43 cnt++; 44 start = start+len*4; 45 } 46 if (n%2) 47 { 48 int m=(n+1)/2; 49 matrix[m][m]=n*n; 50 } 51 int i,j; 52 for (i=1;i<=n;i++) 53 { 54 for (j=1;j<=n;j++) 55 { 56 printf("%2d ",matrix[i][j]); 57 } 58 printf("\n"); 59 60 } 61 return 0; 62 63 }