递归:矩阵螺旋输出(36行搞定)

递归解矩阵螺旋

做题的时候遇到一个有点意思的题目, 之前用枚举法和暴力遍历做过这个矩阵螺旋输出,然后当天晚上想了下用递归做,非常爽 题目如下:
给定一个 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 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值