回型取数(JAVA)

本文详细解析了矩阵回形取数算法,即沿矩阵边缘顺时针方向取出所有元素的方法。文章介绍了算法的基本思路,包括确定环状打印的次数和如何进行环状打印,适用于解决剑指offer中29题顺时针打印矩阵的问题。

题目描述:
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

思路:本题即为剑指offer中29题顺时针打印矩阵的问题。需要解决的问题的有两个,一个是环状打印要循环多少次,第二是如何进行环状打印。
1.首先,每一轮开始的坐标x,y都相同,开始为0,后续每轮加一。我们发现循环打印的条件是columns>startX2&&rows>startY2.
2.打印可能有四步,向右,向下,向左,向上。但并不是每次都如此,因此我们要分析具体条件。(1)第一步向右总是需要的(2)当终止行号大于起始行号,也就是至少要两行,才有第二步向下。(3)至少有两行之后,还要至少两列才有第三步向左。(4)有两列的情况下,当至少有三行才有第四步向上。

public class HuiXing {

    public static void printMatrixClockWisely(int[][] num,int columns,int rows){
        if (num==null||columns<=0||rows<=0)
            return;
        //start为每次开始的横纵坐标
        int start = 0;
        while (columns>2*start&&rows>2*start){
            PrintMatrixInCircle(num,columns,rows,start);
            start++;
        }
    }
    public static void PrintMatrixInCircle(int[][] num,int columns,int rows,int start){
        int EndX = columns-1-start;
        int EndY = rows-1-start;
        for (int i = start; i <=EndX ; i++) {
            System.out.println(num[start][i]);
        }
        if (start<EndY)
        {
            for (int i = start+1; i <=EndY ; i++) {
                System.out.println(num[i][EndX]);
            }
        }
        if (start<EndX&&start<EndY){
            for (int i = EndX-1; i >=start ; i--) {
                System.out.println(num[EndY][i]);
            }
        }
        if (start<EndY-1&&start<EndX)
            for (int i = EndY-1; i >start ; i--) {
                System.out.println(num[i][start]);
            }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值