有道的一道笔试题及其解答——打印双螺旋矩阵

来源:互联网 发布:mac装双系统分区 编辑:程序博客网 时间:2024/05/06 03:23

实验室师兄找工作时在有道遇到的一道笔试题:打印双螺旋矩阵。

双螺旋矩阵的定义如下,矩阵的最中心是1,往上是2,右拐3,向下4,然后依次5、6,7...构成一条顺序增大的螺旋线,此外,如果从中心往下走的话,也是一条对称的螺旋线。题目是给定一个矩阵维度N,将其打印出来,示例如下。要求在纸上把代码写完整,时间半小时左右。

 

  25    14    15    16    17    18    19
  24    13     6     7       8     9      20
  23    12     5     2       3    10     21
  22    11     4     1       4    11     22
  21    10     3     2       5    12     23
  20     9      8     7       6    13     24
  19    18    17    16    15    14    25

看上去似乎挺简单,但是做的时候还是遇到了一些麻烦,最后参考师兄的思路,我给出了下面的实现。基本思路是,先打印中心,然后一圈一圈地将外围矩阵打印出来。打印每圈的时候,先分别计算出左上角和右下角的坐标(Pos)和值,然后沿着螺旋线的方向,从左上角出发打印这一圈矩阵的上边和右边;从右下角出发打印下边和左边。代码如下,能够正确运行,欢迎提出意见。

 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. typedef struct {
  5.         int row;
  6.         int column;
  7. } Position;
  8. void print_screws_matrix( int size )
  9. {
  10.         int **matrix = (int **) malloc( size*sizeof(int*) );
  11.         int i,j;   // just for loop
  12.         for( i = 0; i < size; ++i )
  13.                 matrix[i] =  (int *) malloc( size*sizeof(int) );
  14.         /* initialize matrix center */
  15.         Position centerPos;
  16.         centerPos.row = ( size - 1 )/2;
  17.         centerPos.column = ( size - 1 )/2;
  18.         matrix[ centerPos.row ][ centerPos.column ] = 1;
  19.         int screwNum;
  20.         /* screwNum of matrix center is 0 */
  21.         for( screwNum = 1; screwNum <= (size-1)/2; ++screwNum ) {
  22.                 /* get the beginning positions for each screw */
  23.                 Position screwUpRightPos, screwDownLeftPos;
  24.                 screwUpRightPos.row = centerPos.row - screwNum;
  25.                 screwUpRightPos.column = centerPos.column - screwNum + 1;
  26.                 screwDownLeftPos.row = centerPos.row + screwNum;
  27.                 screwDownLeftPos.column = centerPos.column + screwNum - 1;
  28.                 /* initialize beginning positions */
  29.                 matrix[ screwUpRightPos.row ][ screwUpRightPos.column ]
  30.                         = matrix[ screwUpRightPos.row + 1 ][ screwUpRightPos.column ] + 1;
  31.                 matrix[ screwDownLeftPos.row ][ screwDownLeftPos.column ]
  32.                         = matrix[ screwDownLeftPos.row - 1 ][ screwDownLeftPos.column ] + 1;
  33.                 /* calculate up and down sides of screw */
  34.                 for( i = 0; i < 2*screwNum - 1; ++i ) {
  35.                         screwUpRightPos.column++;
  36.                         matrix[ screwUpRightPos.row ][ screwUpRightPos.column ]
  37.                                 = matrix[ screwUpRightPos.row][ screwUpRightPos.column - 1 ] + 1;
  38.                 /* calculate up and down sides of screw */
  39.                 for( i = 0; i < 2*screwNum - 1; ++i ) {
  40.                         screwUpRightPos.column++;
  41.                         matrix[ screwUpRightPos.row ][ screwUpRightPos.column ]
  42.                                 = matrix[ screwUpRightPos.row][ screwUpRightPos.column - 1 ] + 1;
  43.                         screwDownLeftPos.column--;
  44.                         matrix[ screwDownLeftPos.row ][ screwDownLeftPos.column ]
  45.                                 = matrix[ screwDownLeftPos.row ][ screwDownLeftPos.column + 1 ] + 1;
  46.                 }
  47.                 /* calculate right and left sides of screw */
  48.                 for( i = 0; i < 2*screwNum; ++i ) {
  49.                         screwUpRightPos.row++;
  50.                         matrix[ screwUpRightPos.row ][ screwUpRightPos.column ]
  51.                                 = matrix[ screwUpRightPos.row - 1][ screwUpRightPos.column ] + 1;
  52.                         screwDownLeftPos.row--;
  53.                         matrix[ screwDownLeftPos.row ][ screwDownLeftPos.column ]
  54.                                 = matrix[ screwDownLeftPos.row + 1][ screwDownLeftPos.column ] + 1;
  55.                 }
  56.         }
  57.         /* print matrix */
  58.         for( i = 0; i < size; ++i ) {
  59.                 for( j = 0; j < size; ++j )
  60.                        printf( "%4d  ",matrix[ i ][ j ]);
  61.                 printf( "/n" );
  62.         }
  63.         for( i = 0; i < size; ++i )
  64.                 free( matrix[i] );
  65.         free( matrix );
  66. }
  67. int main()
  68. {
  69.         print_screws_matrix( 21 );
  70.         return 0;
  71. }
原创粉丝点击