生成变换方向矩阵

如上图所示,本文的主要目的是生成一个这样按红线顺序从1,2,3,4,5,6,...的不断变换螺旋方向的螺旋矩阵。

此种矩阵是前几天华为面试的时候提出来的,当时只是给出了一个解决方法,并没有写实现代码,今天有时间整理一下把代码写出来供大家分享。

算法思路:

根据每一个奇数首行和偶数首列为平方数的特点,分别以这点位依据去填充数据。

 程序输出:

 

 

C#代码如下: 

代码
 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 

 

 

posted @ 2010-09-16 19:32  elite_lcf  阅读(1840)  评论(3编辑  收藏  举报
知识共享许可协议
本博客采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。