【C/C++练习题】顺时针打印矩阵

举报
王建峰 发表于 2021/11/19 03:06:02 2021/11/19
【摘要】 《剑指Offer》面试题29:顺时针打印矩阵 1 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。   2 问题分析 <1>首先理解问题,借用图形将问题抽象化为具体。 /* 1 2 3 4 5 6 7 8 9 10...

《剑指Offer》面试题29:顺时针打印矩阵


1 题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

 

2 问题分析

<1>首先理解问题,借用图形将问题抽象化为具体。


  
  1. /*
  2. 1 2 3 4
  3. 5 6 7 8
  4. 9 10 11 12
  5. 13 14 15 16
  6. */

<2>如果把顺时针打印矩阵想象成打印一个又一个的圈,可以利用循环的方法来实现。分析循环开始和循环结束的条件

每次打印一个圈,起点位置的坐标值相等,即 startX = startY。并且满足

columns >= startX*2) && (rows >= startY*2)
 

<3>在具体分析实现打印一个圈,又需要哪些步骤,要不要考虑边界条件。其中,由于最后一个圈的矩阵会发生退化,要确定每一步的执行条件。

PS:拿到问题,先至上向下分析问题,在从下向上解决问题。

 

3 代码


  
  1. #include "iostream"
  2. #include "cstdlib"
  3. using namespace std;
  4. //问题:顺时针打印矩阵
  5. bool Print_array_clockwise(int** numbers, int columns, int rows);
  6. void Print_array_circle(int** numbers, int columns, int rows, int start);
  7. //功能:顺时针方式打印数组
  8. //输入:numbers矩阵首地址, columns 列数, rows 行数
  9. //输出:false 参数无效, true 成功
  10. bool Print_array_clockwise(int** numbers, int columns, int rows)
  11. {
  12. //1.检查参数的有效性
  13. if ( (numbers == nullptr) || (columns <= 0) || (rows <= 0) )
  14. {
  15. return false;
  16. }
  17. int start = 0; //定义起点(start, start)
  18. //2.循环方式顺时针打印矩阵,每次循环打印一圈
  19. while ( (columns >= start*2) && (rows >= start*2) )
  20. {
  21. Print_array_circle(numbers, columns, rows, start); //打印一圈
  22. start++;
  23. }
  24. return true;
  25. }
  26. //打印一圈元素,分成四个步骤。由于打印到最后一个矩阵的时候,矩阵会退化(这时候不确定要分成几步),所以要明确每一步的执行条件
  27. void Print_array_circle(int** numbers, int columns, int rows, int start)
  28. {
  29. int endX = columns - 1 - start; //终点列坐标
  30. int endY = rows - 1 - start; //终点行坐标
  31. //1.从左向右打印列元素
  32. if (start <= endX)
  33. {
  34. for (int i = start;i <= endX;i++)
  35. {
  36. cout << numbers[start][i] << ",";
  37. }
  38. }
  39. //2.从上往下打印行元素
  40. if (start < endY)
  41. {
  42. for (int i = start+1;i <= endY;i++)
  43. {
  44. cout << numbers[i][endX] << ",";
  45. }
  46. }
  47. //3.从右向左打印列元素
  48. if ( (start < endX) && (start < endY) )
  49. {
  50. for (int i = endX-1;i >= start;i--)
  51. {
  52. cout << numbers[endY][i] << ",";
  53. }
  54. }
  55. //4.从下向上打印行元素
  56. if ( (start < endX) && (start+1 < endY) )
  57. {
  58. for (int i = endY-1; i >= start+1;i--)
  59. {
  60. cout << numbers[i][start] << ",";
  61. }
  62. }
  63. }
  64. void Test(int columns, int rows)
  65. {
  66. int** numbers = new int*[rows];
  67. for(int i = 0; i < rows; ++i)
  68. {
  69. numbers[i] = new int[columns];
  70. for(int j = 0; j < columns; ++j)
  71. {
  72. numbers[i][j] = i * columns + j + 1;
  73. }
  74. }
  75. Print_array_clockwise(numbers, columns, rows);
  76. cout << endl;
  77. }
  78. int main(int argc, char const *argv[])
  79. {
  80. Test(3, 3); //3行3列
  81. Test(1, 5); //5行1列
  82. Test(5, 1); //1行5列
  83. return 0;
  84. }

 

4 运行

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/99230219

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。