Java 顺时针打印矩阵

题目描述

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

测试样例:
[[1,2],[3,4]],2,2

返回:[1,2,4,3]


    public static void main(String[] args) {
        int m = 5;
        int n = 7;
        int mat [][] = new int[n][m];
        int temp = 0;
        for (int a = 0 ; a < n;a++){
            for(int j = 0; j < m; j++){
                mat[a][j] = temp;
                System.out.print(temp+"\t");
                temp++;
            }
            System.out.println();
        }
        calc(mat,n,m);
    }

    public static void calc(int[][] mat, int n, int m){//m 列 n行
        List<Integer> lists = new ArrayList<Integer>();

        class Point{
            int x;
            int y;

            public Point(int x,int y){
                this.x = x;
                this.y = y;
            }
        }

        List<Point> up_left = new ArrayList<Point>();
        List<Point> up_right = new ArrayList<Point>();
        List<Point> down_left = new ArrayList<Point>();
        List<Point> down_right = new ArrayList<Point>();


        //如果 矩阵是胖的 或者是正方形 ,就是行数 小于 列数,或者 行数等于 列数
        if(m >= n){
            int row = n%2 == 1?n/2+1:n/2;
            int row_down = n/2;

            for (int i = 0 ; i < row ; i++){
                up_left.add(new Point(i,i));
                up_right.add(new Point(i,m-1-i));
            }

            for(int i = 0 ; i < row_down ; i++){
                down_left.add(new Point(n-1-i,i));
                down_right.add(new Point(n-1-i,m-1-i));
            }

            for (int i = 0 ; i < up_left.size() ; i++){
                Point upleft = up_left.get(i);
                Point upright = up_right.get(i);
                Point downleft =  null;
                Point downright = null;
                if(i <= row_down - 1){
                    downleft = down_left.get(i);
                    downright = down_right.get(i);
                }
                for(int a = upleft.y;a <= upright.y ; a++){
                    lists.add(mat[upleft.x][a]);
                    System.out.print(mat[upleft.x][a]+"\t");
                }
                if(downleft != null){
                    for(int a = upright.x+1;a <= downright.x ; a++){
                        lists.add(mat[a][upright.y]);
                        System.out.print(mat[a][upright.y]+"\t");
                    }
                    for(int a = downright.y-1;a >= downleft.y ; a--){
                        lists.add(mat[downright.x][a]);
                        System.out.print(mat[downright.x][a]+"\t");
                    }
                    for(int a = downleft.x-1;a >= upleft.x+1 ; a--){
                        lists.add(mat[a][downleft.y]);
                        System.out.print(mat[a][downleft.y]+"\t");
                    }
                }
            }
        }
        //是瘦的 行数大于列数
        else{
            int col = m%2 == 1?m/2+1:m/2;
            int col_down = m/2;

            for (int i = 0 ; i < col ; i++){
                up_left.add(new Point(i,i));
                down_left.add(new Point(n-1-i,i));
            }

            for(int i = 0 ; i < col_down ; i++){
                up_right.add(new Point(i,m-1-i));
                down_right.add(new Point(n-1-i,m-1-i));
            }

            for (int i = 0 ; i < up_left.size(); i++){
                Point upleft = up_left.get(i);
                Point downleft =  down_left.get(i);

                Point upright = null;
                Point downright = null;
                if(i <= col_down - 1){
                    upright = up_right.get(i);
                    downright = down_right.get(i);
                }

                if(upright != null){
                    for(int a = upleft.y;a <= upright.y ; a++){
                        lists.add(mat[upleft.x][a]);
                        System.out.print(mat[upleft.x][a]+"\t");
                    }
                    for(int a = upright.x+1;a <= downright.x ; a++){
                        lists.add(mat[a][upright.y]);
                        System.out.print(mat[a][upright.y]+"\t");
                    }
                    for(int a = downright.y-1;a >= downleft.y ; a--){
                        lists.add(mat[downright.x][a]);
                        System.out.print(mat[downright.x][a]+"\t");
                    }
                    for(int a = downleft.x-1;a >= upleft.x+1 ; a--){
                        lists.add(mat[a][downleft.y]);
                        System.out.print(mat[a][downleft.y]+"\t");
                    }
                }else{
                    for(int a = upleft.x;a <= downleft.x ; a++){
                        lists.add(mat[a][upleft.y]);
                        System.out.print(mat[a][upleft.y]+"\t");
                    }
                }

            }
        }

        int result [] = new int[m*n];
        for (int j = 0;j<lists.size();j++){
            result[j] = lists.get(j);
            //System.out.print(result[j]+"\t");
        }

        System.out.println(result);

        return result;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值