剑指offer题20_顺时针打印矩阵

一.题目:

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

二.分析:

当我们遇到一个复杂的问题,可以用图形来帮助我们思考。

1.我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。

2.下一步分析循环结束的条件。我们可以分析出,让循环继续的条件是column > startX * 2并且rows > startY * 2。

三.答案:

void printMatrixClockwisely(int **numbers, int columns, int rows) {
        if (numbersv == NULL || columns <= 0 || rows <= 0) {
                return;
        }

        int start = 0;

        while (columns < start * 2 && rows < start * 2) {
                printMatrixCircle(numbers, columns, rows, start);

                start++;
        }
}

void printMatrixCircle(int **numbers, int columns, int rows, int start) {
        int endX = columns - 1 - start;
        int endY = rows - 1 - start;

        // print one row from left to right.
        for (int i = start; i < endX; i++) {
                int number = number[start][i];
                printNumber(number);
        }
        // print one column from top to bottom.
        if (start < endY) {
                for (int i = start + 1; i < endY; i++) {
                        int number = number[i][endX];
                        printNumber(number);
                }
        }
        // print one row from right to left.
        if (start < endX && start < endY) {
                for (int i = endX - 1; i >= start; i--) {
                        int number = number[endY][i];
                        printNumber(number);
                }
        }
        // print one row from right to left.
        if (start < endX && start < endY) {
                for (int i = endX - 1; i >= start; i--) {
                        int number = number[endY][i];
                        printNumber(number);
                }
        }
        // print one column from bottom to top.
        if (start < endX && start < endY - 1) {
                for (int i = endY - 1; i >= start + 1; i--) {
                        int number = number[i][start];
                        printNumber(number);
                }
        }
}

四.相关题目:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值