顺时针打印矩阵
来源:互联网 发布:超级玛丽 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
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 }
阅读全文
0 0
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 矩阵顺时针打印
- 顺时针打印矩阵
- 顺时针打印矩阵[算法]
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 顺时针打印矩阵
- 二叉树的镜像
- 16. 排序--简单排序
- Spring
- IDEA Error:java: Compilation failed: internal java compiler error
- 机房合作——报表
- 顺时针打印矩阵
- mysql之存储过程把字符串拆分成单词,然后进行数据插入
- C++多态的实现原理
- mysql查询5分钟内的数据
- 队列(数组实现和链表实现)
- 水到渠成的一个多线程安全案例【多窗口售票】别以为很简单,你看了绝对不会让你失望!
- java循环遍历数组,List,Map
- HDU2546:饭卡
- 2 3 5 7的倍数