递归解矩阵螺旋
做题的时候遇到一个有点意思的题目, 之前用枚举法和暴力遍历做过这个矩阵螺旋输出,然后当天晚上想了下用递归做,非常爽 题目如下:
给定一个 mm 行、nn 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素
起初的想法很单纯, 就是控制输出边界, 然后一直循环到最内层,结束, 但是本人不想这么复杂, 就去csdn上搜这个题目,看看有没有巧妙的方法, 看了半天,发现大部分的做法都很单纯, 大致思路都是: 记录矩阵的箭头每走一行或者一列以后下一个平行的箭头还能走多少位置. pass away 看到的代码逻辑性都非常的强,也很长. 因此我最终还是选择自己思考;
- 简单说一下递归的思路: 1. 我们按层去一圈一圈的输出这个矩阵, 当然 每一圈具体怎么输出呢?
我最终的方案是这样的, 首先第一行所以元素, next下来,之后最后一行倒着, 再上去,这样就完整的输出了一层, 然后内层也按同样的操作,递归就好
如何递归呢?
- 既然我们要按圈去递归, 那我们就要设计好递归的参数, 用参数去确定边界, 因为矩形给两个点其实就确定了, 那么在平面直∠坐标系, 两个点就是(a, b) ,(c, d) 然后下一层的矩形顶点就变成了(a + 1, b + 1), (c - 1, d - 1). 这样就可以递归了
- 输出最外层 ,然后调用函数输出内一层, 再继续向内递归
- 函数原型 void spiral(int arr[][100],int a, int b, int c, int d)
- 要输出下一层我们就调用 spiral(arr, a+1, b+1, c-1, d-1)
- 思考递归的边界: 当这个上边界和下边界重合或者左右边界重合了我们就要返回了, 当然这里面还要一些细节, 就是当矩阵只有2 行: 这个时候我们让(b+1)和(d-1)这个时候下边界会跑到上边界上面 ;还有就是当矩阵只有一行我们怎么处理: 关于这些细节xdm看下面的代码
#include <stdlib.h>
#include