顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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 static java.util.ArrayList printMatrix(int [][] matrix) {
        java.util.ArrayList<Integer> list = new java.util.ArrayList();
        int rmin = 0;    //左上row
        int lmin = 0;    //左上line
        
        int rmax=matrix.length-1;    //右下row 
        int lmax = matrix[0].length-1;   //右下line
         
        while(rmax>=rmin && lmax>=lmin){
            print(list,matrix,rmin,lmin,rmax,lmax);
            
            if(rmax-rmin<=1||lmax-lmin<=1){     //只剩一两行或者一两列,表明上个print方法已经打印了所有数
                break;
            }
            else{
                rmax -=1;
                rmin +=1;
                lmax -=1;
                lmin +=1;
            }
        }
        return list;
    }
    
    public static void print(java.util.ArrayList list, int[][] arr,int rmin,int lmin,int rmax,int lmax){
        //top
        for(int i=lmin;i<=lmax;i++){
            list.add(arr[rmin][i]);
        }
        //right
        if(rmax-rmin>1){          //至少三行
            for(int i=rmin+1;i<=rmax-1;i++){
                list.add(arr[i][lmax]);
            }
        }
        //bottom
        if(rmax>rmin){             //至少两行
            for(int i=lmax;i>=lmin;i--){
                list.add(arr[rmax][i]);
            }
        }
        
        //left
        if(rmax-rmin>1 && lmax-lmin>0){  // 至少三行两列
            for(int i=rmax-1;i>=rmin+1;i--){
                list.add(arr[i][lmin]);
            }
        }
    }

 

posted on 2017-08-26 16:00  zhangxiaoyu  阅读(149)  评论(0)    收藏  举报

导航