剑指Offer-20-顺时针打印矩阵
来源:互联网 发布:音频频谱分析软件 编辑:程序博客网 时间:2024/05/19 06:38
题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。
比如1 2 3 4 5 6 7 89 10 11 1213 14 15 16打印结果为 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
思路:
顺时针打印实际上是每次循环打印一圈矩阵的外层,然后圆圈不断向内缩小,每次打印的起始点实际为(i,i)i=0,1,2,…。
打印起始点的终止条件为
2*i<rows && 2*i < cols
圆圈的打印规律为
1.从左向右打印
2.从上到下打印
3.从右到左打印
4.从下到上打印
每一步打印的前提条件:
1.总是需要,因为打印一圈至少有一步。
2.如果只有一行,那么不需要第二步,所以第二步的前提条件是终止行号大于起始行号。
3.第三步的前提条件是圈内至少有两行两列,即,除了第二步的前提条件以外,还有终止列号大于起始列号。
4.第四步的前提条件是圈内至少有3行两列,即,除了第三步的前提条件以外,还要终止行号大于起始行号+1
#include <iostream>using namespace std;void printMatrix(int** matrix, int rows, int cols) { if (rows <= 0 || cols <= 0) return; int start = 0; //判断打印起始点循环的终止条件 while (start * 2 < rows && start * 2 < cols) { //以(i,i)为起始点,打印一圈数值 print(matrix, rows, cols, start); start++; }}//以(start,start)为起点,顺时针打印一圈数值void print(int** matrix, int rows, int cols, int start) { //终止列号 int endX = cols - start - 1; //终止行号 int endY = rows - start - 1; //从左到右打印一行 for (int i = start; i <= endX; i++) cout << matrix[start][i] << " "; //从上到下打印一列 if (endY > start) { for (int i = start + 1; i <= endY; i++) cout << matrix[i][endX] << " "; } //从右到左打印一行 if (endY > start && endX > start) { for (int i = endX - 1; i >= start; i--) cout << matrix[endY][i] << ""; } //从下到上打印一列 if (endY - 1 > start && endX > start) { for (int i = endY - 1; i >= start + 1; i--) cout << matrix[i][start] << " "; }}
0 0
- 剑指offer(20)顺时针打印矩阵
- 剑指offer 20 - 顺时针打印矩阵
- 剑指Offer-20-顺时针打印矩阵
- 剑指Offer 20 顺时针打印矩阵
- 剑指offer-20:顺时针打印矩阵
- 【剑指offer】题20:顺时针打印矩阵
- 剑指offer 20 顺时针打印矩阵
- 【剑指offer】顺时针打印矩阵
- 剑指offer--顺时针打印矩阵
- 剑指offer--顺时针打印矩阵
- 剑指offer 顺时针打印矩阵
- 剑指offer:顺时针打印矩阵
- 《剑指offer》顺时针打印矩阵
- 剑指offer-顺时针打印矩阵
- 剑指offer 顺时针打印矩阵
- 剑指offer:顺时针打印矩阵
- 剑指offer-顺时针打印矩阵
- 剑指offer 顺时针打印矩阵
- 测试给andorid编写驱动
- utf8_general_ci、utf8_unicode_ci和utf8_bin的区别
- WCF 简易教程 IIS配置(一)
- BST:二叉排序树算法
- C语言——逗号表达式
- 剑指Offer-20-顺时针打印矩阵
- Apache与Tomcat的联系和区别
- 四维矩阵、四维数组
- 《懒人Shell脚本》之一——遍历文件并格式化输出文件
- CC2540 UART数据失真分析
- Communication System
- Android 之 Retrofit 入门介绍
- 牛顿迭代解立方根
- Java与Mysql开发中的特殊字符(包括Emoji)