顺时针打印矩阵

来源:互联网 发布:超级玛丽 java 编辑:程序博客网 时间:2024/06/02 04:03
  1 /*
  2     顺时针打印矩阵
  3     输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵:
  4     1   2   3   4
  5     5   6   7   8
  6     9   10  11  12
  7     13  14  15  16
  8     则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10
  9     由于是以外圈到内圈的顺序依次打印,我们可以把矩阵想象成若干个圈,如图所示,我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。
 10     接下来分析循环结束的条件。假设这个矩阵的行数是rows,列数是columns。打印第一圈的左上角的坐标是(0,0),第二圈的左上角的坐标是(1,1),依次类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可以在矩阵>    中选取左上角为(start,start)的一圈作为我们分析的目标、
 11     对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角的坐标任然是(2,2)。我们发现6>2*2依然成立,。于是我们可以得出,让循环继续>    的条件是columns>startX*2并且rows>startY*2。
 12

 13 */

 15 void PrintMatrixClockwisely(int** numbers,int columns,int rows) 16 { 17     if(numbers == NULL || columns <= 0 || rows <= 0) 18         return; 19 20     int start = 0; 21 22     while(columns > start*2 && rows > start*2) 23     { 24         PrinMatrixInCircle(numbers,columns,rows,start); 25         ++start; 26     } 27 } 28 29 /* 30     仔细分析打印每一步的条件,第一步总是需要的,因为打印一圈至少有一步。如果只有一行,那么就不用第二步了。 31     也就是需要第二步的前提条件是终止行号大于起始行号。需要第三步打印的前提条件圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。同理,需要打印出第四步的前提条件是至少    有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起始列号。 32 */ 33 34 void PrinMatrixInCircle(int** numbers,int columns,int rows,int start) 35 { 36     int endX = columns-1-start; 37     int endY = rows-1-start; 38 39     for(int i = start; i <= endX; ++i) 40     { 41         int number = numbers[start][i]; 42         printNumber(number); 43     } 44 45     if(start < endY) 46     { 47         for(int i = start + 1; i <= endY; ++i) 48         { 49             int number = numbers[i][endX]; 50             printNumber(number); 51         } 52     } 53 54     if(start < endX && start < endY) 55     { 56         for(int i = endX - 1; i >= start; --i) 57         { 58             int number = numbers[endY][i]; 59             printNumber(number); 60         } 61     } 62 63     if(start < endX && start < endY - 1) 64     { 65         for(int i = endY - 1; i >= start + 1; --i) 66         { 67             int number = numbers[i][start]; 68             printNumber(numbers); 69         } 70     } 71 }


原创粉丝点击