剑指offer之顺时针打印矩阵

1.分析

  • 每次以左上角为标志打印一圈,a[0][0]最外圈,a[1][1]次外圈,依次类推,a[k][k], 2*k<rows && 2*k<cols不越界即可

  • 打印一圈分为4步,a:从左往右打印上面一行,b:从上往下打印右侧一列,c:从右往左打印下面一行,d:从下往上打印左侧一列

  • 最后一圈有可能退化到只有一步(一行),两步(一列),或者三步(2行)。第一步骤a是必不可少的.

2.代码

#include<stdio.h>

void printCircle(int** a, int rows, int cols, const int leftUp)
{
    int i;
    int endX = cols - 1 - leftUp;
    int endY = rows - 1 - leftUp;

    for(i=leftUp; i<=endX; i++)//打印上面一横行
        printf("%d ", a[leftUp][i]);

    for(i=leftUp+1; i<=endY; i++)//打印右侧一竖列,注意i=leftUp+1,不然右上角重复
        printf("%d ", a[i][endX]);

    for(i=endX-1; i>=leftUp; i--)
        printf("%d ", a[endY][i]);//从右往左打印下面一横行,注意i=endX-1,不然右下角重复

    for(i=endY-1; i>leftUp; i--)
        printf("%d ", a[i][leftUp]);//从下往上打印左侧一竖列,注意i=endY-1,不然左下角重复,i>leftUp,不带等号,不然左上角重复
    printf("\n");
}

void printMatrix(int** a, int rows, int cols)
{
    if(a==NULL || rows<=0 || cols<=0)
        return;

    for(int i=0; i*2<rows && i*2<cols; i++)
    {
        printCircle(a, rows, cols, i);//打印以a[i][i]为左上角的一圈
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值