`

打印螺旋矩阵

阅读更多

 求职过程遇到的一道面试题,当时没有做出来,回来想出几种方法,其中大多是“蛮力”解法,不得不陷入一堆的 i、j 循环之中。最后想出一种递归解法,现记录如下。
题目如下:
输入N, 打印 N*N 螺旋矩阵
比如 N = 3,打印:
1 2 3
8 9 4
7 6 5
 
N = 4,打印:
1   2   3   4
12 13 14 5
11 16 15 6
10 9   8   7
 
递归解法如下:
 
+--------------------------> X 轴
| 1   2   3   4
|  12 13 14 5
|  11 16 15 6
|  10 9   8   7
|
Y轴
 
设元素1的坐标为(0,0),元素13的坐标为(1,1),……,任一元素的坐标为(x,y)
以下为完整代码:
//功能:打印螺旋矩阵
//参数说明:matrix :螺旋矩阵         (x,y) :第一个元素的坐标
//          start :第一个元素的值     n :矩阵的大小
void SetMatrix(int **matrix, int x, int y, int start, int n) {
       int i, j;
       if (n <= 0)
              return;
       if (n == 1) {
              matrix[x][y] = start;
              return;
       }
       for (i = x; i < x + n-1; i++)          /* 上部 */
              matrix[y][i] = start++;
       for (j = y; j < y + n-1; j++)          /* 右边 */
              matrix[j][x+n-1] = start++;
       for (i = x+n-1; i > x; i--)              /* 底部 */
              matrix[y+n-1][i] = start++;
       for (j = y+n-1; j > y; j--)              /* 左边 */
              matrix[j][x] = start++;
       SetMatrix(matrix, x+1, y+1, start, n-2);     /* 递归 */
}
 
void main() {
       int i, j;
       int n;
    int **matrix; //螺旋矩阵(二维数组)
      
       scanf("%d", &n);
       matrix = (int **)malloc(n * sizeof(int *)); //为矩阵分配空间
       for (i = 0; i<n; i++)
              matrix[i] = (int *)malloc(n * sizeof(int));
      
SetMatrix(matrix, 0, 0, 1, n);
 
       //打印螺旋矩阵
       for(i = 0; i < n; i++) {
              for (j = 0; j < n; j++)
                     printf("%4d", matrix[i][j]);
       printf("\n");
       }
}
 

 

//我修改的Java代码:
public class TestSpiralMatrix {

	
	//功能:打印螺旋矩阵
	//参数说明:matrix :螺旋矩阵         
          //(x,y) :第一个元素的坐标
          //start :第一个元素的值     n :矩阵的大小
	private static void SetMatrix(int[][] matrix, int x, int y, int start, int n) {
	       int i, j;
	       if (n <= 0)
	              return;
	       if (n == 1) {
	              matrix[x][y] = start;
	              return;
	       }
//感觉原来的代码有点问题,我把x和y顺序调整了过来
	       for (i = y; i < y + n-1; i++)          /* 上部 */
	              matrix[x][i] = start++;
	       for (j = x; j < x + n-1; j++)          /* 右边 */
	              matrix[j][y+n-1] = start++;
	       for (i = y+n-1; i > y; i--)              /* 底部 */
	              matrix[x+n-1][i] = start++;
	       for (j = x+n-1; j > x; j--)              /* 左边 */
	              matrix[j][y] = start++;
	       SetMatrix(matrix, x+1, y+1, start, n-2);     /* 递归 */
	}
	 


	public static void main(String[] args) {
		int i, j;
//	       int n=15;
	       int n=4;
	       int[][] matrix = new int[n][n]; //螺旋矩阵(二维数组)
	       
	       SetMatrix(matrix, 0, 0, 1, n);
	 
	       //打印螺旋矩阵
	       for(i = 0; i < n; i++) {
	              for (j = 0; j < n; j++)
	                     System.out.printf("%4d", matrix[i][j]);
	              System.out.printf("\n");
	       }
	}

}

 
 

 


运行结果, n = 15 时
 
1      2        3       4        5       6        7        8       9        10     11      12     13     14   15
56   57      58     59     60     61      62     63      64     65     66      67     68     69   16
55   104   105   106   107   108   109   110   111   112   113   114   115   70   17
54   103   144   145   146   147   148   149   150   151   152   153   116   71   18
53   102   143   176   177   178   179   180   181   182   183   154   117   72   19
52   101   142   175   200   201   202   203   204   205   184   155   118   73   20
51   100   141   174   199   216   217   218   219   206   185   156   119   74   21
50   99     140   173   198   215   224   225   220   207   186   157   120   75    22
49   98     139   172   197   214   223   222   221   208   187   158   121   76    23
48   97     138   171   196   213   212   211   210   209   188   159   122   77    24
47   96     137   170   195   194   193   192   191   190   189   160   123   78    25
46   95     136   169   168   167   166   165   164   163   162   161   124   79    26
45   94     135   134   133   132   131   130   129   128   127   126   125    80   27
44   93     92     91     90      89     88      87     86      85     84     83      82      81   28
43   42     41     40     39      38     37      36     35      34     33     32      31      30   29


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackeagle_/archive/2006/02/22/606341.aspx

分享到:
评论
1 楼 rootxue 2011-09-10  
大哥不用释放内存吗

相关推荐

    Python使用迭代器打印螺旋矩阵的思路及代码示例

    本文将深入探讨如何利用Python的itertools模块以及迭代器来实现打印螺旋矩阵的功能。 螺旋矩阵是一种特殊的二维数组,其中的数字按照顺时针方向螺旋式地递增。在Python中,我们可以借助迭代器这一强大的工具来实现...

    打印螺旋矩阵(C语言实现)

    - **输入输出**:可能需要从用户获取矩阵的大小,并打印出生成的螺旋矩阵。 在提供的链接中,博主可能分享了一个具体的C语言实现螺旋矩阵的示例代码,你可以通过阅读和理解该代码来进一步学习这个概念。同时,这个...

    Java编程实现打印螺旋矩阵实例代码

    Java编程实现打印螺旋矩阵实例代码 Java编程实现打印螺旋矩阵实例代码是指使用Java语言编写的打印螺旋矩阵的程序代码。螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,...

    c语言程序螺旋矩阵的打印

    用c语言编写的一个小代码,实现数据的螺旋输出,我也是个初学者,相互学习。

    Java实现的打印螺旋矩阵算法示例

    主要介绍了Java实现的打印螺旋矩阵算法,结合完整实例形式详细分析了java打印螺旋矩阵的算法原理与实现技巧,需要的朋友可以参考下

    Python实现打印螺旋矩阵功能的方法

    在Python中实现打印螺旋矩阵的功能,可以采用递归的方法,这种方法简洁且易于理解。 首先,我们需要理解螺旋矩阵的填充规则。以一个N×N的矩阵为例,从左上角开始,第一层的元素会按照顺时针方向填充,即从左到右,...

    任意数字螺旋矩阵打印

    在给定的场景中,我们需要实现一个程序,能够根据用户输入的数字n生成一个n×n的螺旋矩阵,并打印出来。例如,当输入为3时,输出的矩阵是: ``` 1 8 7 2 9 6 3 4 5 ``` 在这个螺旋矩阵中,数字从1开始,按照顺时针...

    螺旋矩阵matlab源程序

    螺旋矩阵是一种特殊的矩阵排列方式,它将数字按照顺时针或逆时针方向从左上角开始,沿着螺旋路径填充矩阵。在给定的MATLAB源程序中,我们看到两个程序,分别实现了顺时针和逆时针的螺旋矩阵。 1. 顺时针螺旋矩阵: ...

    用VC++编写的螺旋矩阵,最大可达100

    螺旋矩阵,又称螺旋顺序矩阵,是一种特殊的二维数组排列方式,其特点是元素按顺时针...通过对数组的迭代和方向的控制,我们可以灵活地构建和打印螺旋矩阵。这种问题不仅锻炼了编程技巧,也提升了对二维数据结构的理解。

    螺旋矩阵 c语言

    在`main`函数中,用户被要求输入矩阵的大小,然后调用`printSpiralMatrix`函数生成并打印螺旋矩阵。这个程序的运行结果是根据用户输入的矩阵大小创建并输出相应的螺旋矩阵。 在实际编程中,可能需要对输入进行错误...

    螺旋矩阵VC6

    5. 输出矩阵:最后,将填充好的螺旋矩阵打印出来,以便用户查看结果。 在“正时针外螺旋矩阵奇偶”这个文件中,可能包含的是关于如何处理奇数和偶数大小的矩阵的特殊情况。对于奇数大小的矩阵,中心元素会在最后一...

    螺旋矩阵的实现

    - 当所有的位置都被正确填充后,使用嵌套循环遍历矩阵并将每个元素打印出来,形成最终的螺旋矩阵布局。 4. **示例运行:** - 假设用户输入了一个3x3的矩阵,那么程序会按照螺旋方式依次填入字符,最后输出的结果...

    螺旋矩阵C代码

    螺旋数组: 打印方阵为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 输入 5 输出 矩阵 样例输入 5 样例输出 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 ...

    在vc环境下c++实现螺旋矩阵的输出

    在`main`函数中,用户输入矩阵的大小,程序会生成并打印对应的螺旋矩阵。 通过这样的实现,我们可以看到在VC环境下,C++语言的强大功能可以轻松地处理这种问题。不仅能够理解螺旋矩阵的填充逻辑,还可以进一步扩展...

    螺旋矩阵c语言实现(完整)

    螺旋矩阵是一种特殊的矩阵,其中元素按照顺时针或逆时针方向填充。在这个C语言实现中,程序首先定义了一个二维数组`array`,用于存储螺旋矩阵。用户通过输入`rows`和`cols`来确定矩阵的行数和列数。 在主函数`main...

    螺旋矩阵类代码

    总结来说,这个螺旋矩阵的实现方法是通过对多层循环的巧妙控制,以及对不同方向元素填充的逻辑判断,实现了螺旋矩阵的生成和打印。这样的代码设计思路对于理解和掌握矩阵操作以及循环结构的应用具有很好的学习价值。

    C++螺旋矩阵C++螺旋矩阵C++螺旋矩阵C++螺旋矩阵

    根据给定的信息,本文将详细解释C++螺旋矩阵的相关知识点,包括螺旋矩阵的概念、实现方法以及代码解析。 ### 一、螺旋矩阵的概念 螺旋矩阵是一种按照特定规则填充数字的二维数组。具体而言,从左上角开始,按照...

Global site tag (gtag.js) - Google Analytics