如上图所示,本文的主要目的是生成一个这样按红线顺序从1,2,3,4,5,6,...的不断变换螺旋方向的螺旋矩阵。
此种矩阵是前几天华为面试的时候提出来的,当时只是给出了一个解决方法,并没有写实现代码,今天有时间整理一下把代码写出来供大家分享。
算法思路:
根据每一个奇数首行和偶数首列为平方数的特点,分别以这点位依据去填充数据。
程序输出:
C#代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1
using
System;
2 using System.Collections.Generic;
3
4 namespace spiral_matrix
5 {
6 class Program
7 {
8 static int [,] getMatrix( int n)
9 {
10 // 返回一个生成好的螺旋矩阵
11 int [,] mymatrix = new int [n, n];
12 for ( int i = 0 ; i < n;i ++ )
13 {
14 int tmp = (i + 1 ) * (i + 1 ); // 作为当前i的平方
15 if (i % 2 == 0 )
16 {
17 // i从0开始,所以此时行数为奇数
18 for ( int m = 0 ; m <= i; m ++ )
19 {
20 mymatrix[m, i] = tmp - m;
21 if (i + 1 < n)
22 {
23 mymatrix[m, i + 1 ] = tmp + 1 + m;
24 if (m == i)
25 {
26 // 此列最后一个元素,单独处理
27 mymatrix[m + 1 , i + 1 ] = tmp + 1 + m + 1 ;
28 }
29 }
30 }
31 }
32 else
33 {
34 // 此时行数为偶数
35 for ( int m = 0 ; m <= i; m ++ )
36 {
37 mymatrix[i, m] = tmp - m;
38 if (i + 1 < n)
39 {
40 mymatrix[i + 1 , m] = tmp + 1 + m;
41 if (m == i)
42 {
43 // 此列最后一个元素,单独处理
44 mymatrix[i + 1 , m + 1 ] = tmp + 1 + m + 1 ;
45 }
46 }
47 }
48 }
49 }
50 return mymatrix;
51 }
52 static void show( int [,] matrix)
53 {
54 for ( int i = 0 ;i < matrix.GetLength( 0 );i ++ )
55 {
56 for ( int j = 0 ; j < matrix.GetLength( 1 ); j ++ )
57 {
58 Console.Write( " {0,3} " , matrix[i, j]);
59 }
60 Console.WriteLine();
61 }
62 }
63 static void Main( string [] args)
64 {
65 Console.WriteLine( " 请输入需要输出的变幻螺旋阶数:(为了显示方便,请输入31以下的数字) " );
66 int i;
67 while ((i = int .Parse(Console.ReadLine())) > 0 )
68 {
69 int [,] mymatrix = getMatrix(i);
70 show(mymatrix);
71 }
72 }
73 }
74 }
75
2 using System.Collections.Generic;
3
4 namespace spiral_matrix
5 {
6 class Program
7 {
8 static int [,] getMatrix( int n)
9 {
10 // 返回一个生成好的螺旋矩阵
11 int [,] mymatrix = new int [n, n];
12 for ( int i = 0 ; i < n;i ++ )
13 {
14 int tmp = (i + 1 ) * (i + 1 ); // 作为当前i的平方
15 if (i % 2 == 0 )
16 {
17 // i从0开始,所以此时行数为奇数
18 for ( int m = 0 ; m <= i; m ++ )
19 {
20 mymatrix[m, i] = tmp - m;
21 if (i + 1 < n)
22 {
23 mymatrix[m, i + 1 ] = tmp + 1 + m;
24 if (m == i)
25 {
26 // 此列最后一个元素,单独处理
27 mymatrix[m + 1 , i + 1 ] = tmp + 1 + m + 1 ;
28 }
29 }
30 }
31 }
32 else
33 {
34 // 此时行数为偶数
35 for ( int m = 0 ; m <= i; m ++ )
36 {
37 mymatrix[i, m] = tmp - m;
38 if (i + 1 < n)
39 {
40 mymatrix[i + 1 , m] = tmp + 1 + m;
41 if (m == i)
42 {
43 // 此列最后一个元素,单独处理
44 mymatrix[i + 1 , m + 1 ] = tmp + 1 + m + 1 ;
45 }
46 }
47 }
48 }
49 }
50 return mymatrix;
51 }
52 static void show( int [,] matrix)
53 {
54 for ( int i = 0 ;i < matrix.GetLength( 0 );i ++ )
55 {
56 for ( int j = 0 ; j < matrix.GetLength( 1 ); j ++ )
57 {
58 Console.Write( " {0,3} " , matrix[i, j]);
59 }
60 Console.WriteLine();
61 }
62 }
63 static void Main( string [] args)
64 {
65 Console.WriteLine( " 请输入需要输出的变幻螺旋阶数:(为了显示方便,请输入31以下的数字) " );
66 int i;
67 while ((i = int .Parse(Console.ReadLine())) > 0 )
68 {
69 int [,] mymatrix = getMatrix(i);
70 show(mymatrix);
71 }
72 }
73 }
74 }
75