1. // 面试题29:顺时针打印矩阵
  2. // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
  3.  
  4. #include <iostream>
  5.  
  6. void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
  7. void printNumber(int number);
  8.  
  9. void PrintMatrixClockwisely(int** numbers, int columns, int rows)
  10. {
  11. if (numbers == nullptr || columns <= || rows <= )//鲁棒性
  12. return;
  13.  
  14. int start = ;
  15.  
  16. while (columns > start * && rows > start * )//结束循环条件
  17. {
  18. PrintMatrixInCircle(numbers, columns, rows, start);
  19.  
  20. ++start;
  21. }
  22. }
  23.  
  24. void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
  25. {
  26. int endX = columns - - start;
  27. int endY = rows - - start;
  28.  
  29. // 从左到右打印一行
  30. for (int i = start; i <= endX; ++i)
  31. {
  32. int number = numbers[start][i];
  33. printNumber(number);
  34. }
  35.  
  36. // 从上到下打印一列
  37. if (start < endY)//如果这列(这列第一个点被上面那个打印过了)有一个以上个点
  38. {
  39. for (int i = start + ; i <= endY; ++i)//所以这里start + 1
  40. {
  41. int number = numbers[i][endX];
  42. printNumber(number);
  43. }
  44. }
  45.  
  46. // 从右到左打印一行
  47. if (start < endX && start < endY)//在有上述那一列情况下,还有从左到右的点
  48. {
  49. for (int i = endX - ; i >= start; --i)//由于最右的点让上述那列打印了,于是开头是endX - 1
  50. {
  51. int number = numbers[endY][i];
  52. printNumber(number);
  53. }
  54. }
  55.  
  56. // 从下到上打印一行
  57. if (start < endX && start < endY - )//第一项保证这列不是从上到下那列,第二保证还有除了一三情况下的节点可以打印
  58. {
  59. for (int i = endY - ; i >= start + ; --i)//都得注意打印条件和起始终止位置啊
  60. {
  61. int number = numbers[i][start];
  62. printNumber(number);
  63. }
  64. }
  65. }
  66.  
  67. void printNumber(int number)
  68. {
  69. printf("%d\t", number);
  70. }
  71.  
  72. // ====================测试代码====================
  73. void Test(int columns, int rows)
  74. {
  75. printf("Test Begin: %d columns, %d rows.\n", columns, rows);
  76.  
  77. if (columns < || rows < )
  78. return;
  79.  
  80. int** numbers = new int*[rows];//建立一个二维矩阵第一步
  81. for (int i = ; i < rows; ++i)
  82. {
  83. numbers[i] = new int[columns];//建立一个二维矩阵第二步
  84. for (int j = ; j < columns; ++j)
  85. {
  86. numbers[i][j] = i * columns + j + ;
  87. }
  88. }
  89.  
  90. PrintMatrixClockwisely(numbers, columns, rows);
  91. printf("\n");
  92.  
  93. for (int i = ; i < rows; ++i)
  94. delete[](int*)numbers[i];//还得循环删除
  95.  
  96. delete[] numbers;//然后还得删除!
  97. }
  98.  
  99. int main(int argc, char* argv[])
  100. {
  101. /*
  102. 1
  103. */
  104. Test(, );
  105.  
  106. /*
  107. 1 2
  108. 3 4
  109. */
  110. Test(, );
  111.  
  112. /*
  113. 1 2 3 4
  114. 5 6 7 8
  115. 9 10 11 12
  116. 13 14 15 16
  117. */
  118. Test(, );
  119.  
  120. /*
  121. 1 2 3 4 5
  122. 6 7 8 9 10
  123. 11 12 13 14 15
  124. 16 17 18 19 20
  125. 21 22 23 24 25
  126. */
  127. Test(, );
  128.  
  129. /*
  130. 1
  131. 2
  132. 3
  133. 4
  134. 5
  135. */
  136. Test(, );
  137.  
  138. /*
  139. 1 2
  140. 3 4
  141. 5 6
  142. 7 8
  143. 9 10
  144. */
  145. Test(, );
  146.  
  147. /*
  148. 1 2 3
  149. 4 5 6
  150. 7 8 9
  151. 10 11 12
  152. 13 14 15
  153. */
  154. Test(, );
  155.  
  156. /*
  157. 1 2 3 4
  158. 5 6 7 8
  159. 9 10 11 12
  160. 13 14 15 16
  161. 17 18 19 20
  162. */
  163. Test(, );
  164.  
  165. /*
  166. 1 2 3 4 5
  167. */
  168. Test(, );
  169.  
  170. /*
  171. 1 2 3 4 5
  172. 6 7 8 9 10
  173. */
  174. Test(, );
  175.  
  176. /*
  177. 1 2 3 4 5
  178. 6 7 8 9 10
  179. 11 12 13 14 15
  180. */
  181. Test(, );
  182.  
  183. /*
  184. 1 2 3 4 5
  185. 6 7 8 9 10
  186. 11 12 13 14 15
  187. 16 17 18 19 20
  188. */
  189. Test(, );
  190. system("pause");
  191. return ;
  192. }

《剑指offer》第二十九题(顺时针打印矩阵)的更多相关文章

  1. 剑指Offer(十九)——顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下4 X 4矩阵: 1   2    3     4 5   6    7     8 9   10  11  ...

  2. 【剑指offer】面试题 29. 顺时针打印矩阵

    面试题 29. 顺时针打印矩阵 题目描述 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  3. 《剑指offer》面试题20 顺时针打印矩阵 Java版

    我的方法:遇到这种题最好在纸上画一画打印路线.我利用了4个标志left.top.right.bottom,表示当前需要打印的左界.上届.右界和下界,换句话说这些界线之外的已经打印了,如此一来判断结束的 ...

  4. 剑指offer——面试题29:顺时针打印矩阵

    #include"iostream" #include"stdio.h" using namespace std; void PrintMatrixInCirc ...

  5. 《剑指offer》面试题29. 顺时针打印矩阵

    问题描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4 ...

  6. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  7. 剑指offer十九之顺时针打印矩阵

    一.题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  8. 剑指Offer(书):顺时针打印数组

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...

  9. 剑指offer五十九之按之字形顺序打印二叉树

    一.题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.二.思路 详见代码 三.代码 import j ...

  10. 剑指offer四十九之把字符串转换成整数

    一.题目 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 二.思路 详见代码. 三.代码 public class Solution { ...

随机推荐

  1. 网站nginx负载下因程序错误导致多节点重复处理请求的解决过程

    目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载环境下,因为应用程序异常导致某一请求被多节点站点重复处理的问题. ...

  2. mysql主从延迟(摘自http://www.linuxidc.com/Linux/2012-02/53995.htm)

    http://www.linuxidc.com/Linux/2012-02/53995.htm

  3. tfs代码上传到server并下载到新位置

    1.svn与git代码管理原理基本一致,基于文档管理,能看到文件代码,通过设置文件的只读属性来控制代码. 而tfs是基于sqlserver及lock来管理,看不见代码文件 2.tfs没有自己的用户管理 ...

  4. C++中的访问权限

    C++中类的成员的权限: private:只能由该类的成员函数,友元函数访问,不能被该类的对象访问. protected:除了private外还能被子类的函数访问,同样不能被该类的对象访问. publ ...

  5. keras load model 遇到 自定义函数 Lambda(lambda x: softmax(x, axis=1), NameError: global name 'softmax' is not defined

    问题 在定义模型的时候,自定义了一个函数 模型保存之后,load 模型的时候报错: 解决 load 模型的时候需要指定custom object 参考: https://faroit.github.i ...

  6. html5新元素练习(1)

    1, <nav>  是专门由于菜单导航,链接导航的元素 2,  <header> 主体页面的头部,与head不同,它的内容可以显示出来 3,  <footer>页面 ...

  7. UVALive - 7269 I - Snake Carpet

    思路: 多画画就发现从五的时候可以这么填: 六的时候这么填: 七的时候这么填: 看出规律了吗? 没看出的话再画画把. #include <bits/stdc++.h> using name ...

  8. Linux基础命令---tune2fs

    tune2fs tune2fs允许系统管理员在Linux ext2.ext3或ext4文件系统上调整各种可调的文件系统参数.这些选项的当前值可以使用-l选项显示,也可以通过使用dumpe2fs (8) ...

  9. 使用echo命令清空tomcat日志文件

    使用echo命令清空日志文件echo -n "" > /server/tomcat/logs/catalina.out ==>要加上"-n"参数,默 ...

  10. 让nodepad++编辑时链接能双击打开

    让nodepad++编辑时链接能双击打开,Notepad++自动把代码或编辑状态里的链接或URL地址转成可点击的链接,当你双击该URL会打开相应的网页地址,不用复制地址到浏览器打开了,非常方便好用. ...