如上图所示,本文的主要目的是生成一个这样按红线顺序从1,2,3,4,5,6,...的不断变换螺旋方向的螺旋矩阵。
此种矩阵是前几天华为面试的时候提出来的,当时只是给出了一个解决方法,并没有写实现代码,今天有时间整理一下把代码写出来供大家分享。
算法思路:
根据每一个奇数首行和偶数首列为平方数的特点,分别以这点位依据去填充数据。
程序输出:
C#代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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