顺时针打印矩阵(直接算法)

这篇博客探讨了一道经典算法问题——顺时针打印矩阵,通过类比贪食蛇游戏,作者提出了一种直观的解决方案。博主分享了自己的编程思考过程,并提供了相应的Java代码实现,帮助读者理解算法思路。
摘要由CSDN通过智能技术生成

这是一道很经典的题目(顺时针打印矩阵),每次做这道题就让我想起来当初大一的时候刚学c语言那会儿,那时候对编程无比痴迷,每次写代码都写很久,现在感觉已经失去了那份痴迷很久了。

那下面步入正题吧!!!顺时针打印矩阵,其实这和我们玩过的一种游戏很相似--------贪食蛇,特别是以前的诺基亚手机那会,如下一个矩阵:

1    2    3    4

5    6    7    8

9   10  11  12

13 14  15  16

这样一个矩阵:它顺时针打印的话就是:[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]

我看网上有些人的算法很奇怪(也有可能是我太愚钝理解不了),他们居然想的是总结出该矩阵圈数的规律,按照圈数来循环打印,我的思路很直接,题目要求不是让我们按照顺时针来打印吗?我们可以把这个矩阵想象成贪食蛇的活动区域(也可以说是诺基亚的手机屏幕框框),怎么控制贪食蛇让它顺时针依次铺满整个屏幕。

下面是我的代码:

import java.util.ArrayList;
/**
 * 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
 * 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
 * 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
 */
public class 顺时针打印矩阵 {
    int count=0;

    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();   //要打印的序列列表
        int flag = 0;   //方向标志
        int i =0,j = 0; //矩阵坐标
        int top = 1;    //距离上边框距离
        int bottom = matrix.length-1; //距离下边框距离
        int left = 0;                 //距离左边框距离
        int right = matrix[1].length-1; //距离右边框距离
        list.add(matrix[0][0]);
        while (list.size()!=(matrix[0].length*matrix.length)){
            if (flag==0){
                j++;
                if (j<=right){
                    list.add(matrix[i][j]);

                }
                else {
                    flag=1;
                    j=right;
                    right--;
                }
            }

            if (flag==1){
                i++;
                if (i<=bottom){
                    list.add(matrix[i][j]);

                }
                else {
                    flag=2;
                    i = bottom;
                    bottom--;
                }
            }

            if (flag==2){
                j--;
                if (j>=left){
                    list.add(matrix[i][j]);

                }
                else{
                    flag =3;
                    j = left;
                    left++;
                }
            }

            if (flag==3){
                i--;
                if (i>=top){
                    list.add(matrix[i][j]);

                }
                else {
                    flag =0;
                    i = top;
                    top++;
                }
            }

        }
        return list;

    }

    public static void main(String[] args) {
        顺时针打印矩阵 s = new 顺时针打印矩阵();
        int[][] m = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
//        int[][] m = {{1},{2},{3},{4}};

        System.out.println(s.printMatrix(m).toString());
//        System.out.println(s.count);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值