天天看點

順時針和逆時針螺旋列印二維數組(行列式)

一.要求:

   行列式,行和寬不一定相等,要求順時針螺旋列印每一個元素,所謂順時針螺旋即:

第一圈:從第一行第一列元素開始,先從左到右列印第一行所有元素,接着列印最後一剩餘列元素,再從右到左列印最後一行剩餘元素,接着從下到上列印第一列剩餘元素

第二圈:從第二行第二列開始,按上面的順時針順序列印一圈元素

...,一圈圈反複,直到把所有元素無重複的列印完。

逆時針螺旋與上面的順序剛好相反。

二.分析:

  順時針螺旋列印可以将問題分割為:先按順時針列印第一圈,再按順時針列印第二圈,其中每圈又分四個步驟:從左到右,從上到下,從右到左,從下到上。

逆時針螺旋列印可以将問題同樣分割為:先按逆時針列印第一圈,再按擰時針列印第二圈,其中每圈又分四個步驟:從上到下,從左到右,從下到上,從右到左。

三.代碼:

public class LuoxunArr{

    public static void main(String [] args){

        LuoxunArr larr =new LuoxunArr();

        int a[][]= {{0,1,2,3,4,5,6,7},{27,28,29,30,31,32,33,8},{26,47,48,49,50,51,34,9},{25,46,59,60,61,52,35,10},{24,45,58,63,62,53,36,11},{23,44,57,56,55,54,37,12},{22,43,42,41,40,39,38,13},{21,20,19,18,17,16,15,14}};

        //int [][]a=larr.intTwoArr(11,9);

        larr.listIntTwoArr(a);//按正常順序列印數組

        larr.luoTwoArr(a);//按順時針螺旋列印數組

        larr.ReluoTwoArr(a);//按逆時針螺旋列印數組

    }

    //用于生成随機整數

    public int  randomInt(int min,int max){

        //Math.random() [0,1)

        return (int)(Math.random()*(max+1-min)+min);

    //用于生成二維數組,并且用随機整數給每個元素指派

    public int[][] intTwoArr(int line,int col){

        int[][] a= new int[line][];

        for(int i=0;i<line;i++){

            a[i] =new  int[col];

        }        

            for(int j=0;j<col;j++){

                a[i][j]=randomInt(0,9);

            }

        }

        return a;

    //用于按正常順序列印二維數組

    public void listIntTwoArr(int [][] a){

        for(int i=0;i<a.length;i++){

            for(int j=0;j<a[i].length;j++){

                System.out.printf("%3d ",a[i][j]);

            System.out.println();

        System.out.println();

    //用于順時針螺旋列印二維數組

    public void luoTwoArr(int[][] a){

        int len = a.length;   //行列式的行數

        int col = a[0].length;//行列式的列數

        int mid=len<col?len:col;//取行和列的最小值

        int hang=0;//用于記錄已列印的行數

        int lie=0;//用于記錄已列印的列數

        int flag1=0;//用于記錄行标或列标

        int flag2=0;//用于記錄行标或列标

        int i=0;

        int sum=0;

        for(int start=0;start<=mid/2;start++){                    

            //1.左到右列印行

            if(hang<len){

                for(i=start;i<col-start;i++){

                    System.out.print(a[start][i] + " ");    

                    sum++;

                }    

                flag1=i-1;

                hang++;//列印的行數加1            

            }             

            //2.從上到下列印列

            if(lie<col){

                for(i=start+1;i<len-start;i++){

                    System.out.print(a[i][flag1] + " ");

                    sum++;                

                }

                flag2=i-1;

                lie++;    //列印的列數加1 

            }    

            //3.從右到左列印行

                for(i=flag1-1;i>=start;i--){

                    System.out.print(a[flag2][i] + " ");

                flag1=i;    

                hang++;//列印的行數加1  

            }            

            //4.從下到上列印列

                for(i=flag2-1;i>start;i--){

                    System.out.print(a[i][start] + " ");

                lie++;    //列印的列數加1    

            }

        System.out.println("一共列印了 "+sum+" 個元素");

        }

    }

    //用于逆時針螺旋列印二維數組

    public void ReluoTwoArr(int[][] a){

        int len = a.length;   //行列式的行數

        int col = a[0].length;//行列式的列數

        int mid=len<col?len:col;//取行和列的最小值

        int hang=0;//用于記錄已列印的行數

        int lie=0;//用于記錄已列印的列數

        int flag1=0;//用于記錄行标或列标

        int flag2=0;//用于記錄行标或列标

        int i=0;

        int sum=0;

        for(int start=0;start<=mid/2;start++){                    

            //1.上到下列印列

            if(lie<col){

                for(i=start;i<len-start;i++){

                    System.out.print(a[i][start] + " ");    

                    sum++;

                }    

                flag1=i-1;

                lie++;//列印的行數加1            

            }    

            //2.從左到右列印行

            if(hang<len){

                for(i=start+1;i<col-start;i++){

                    System.out.print(a[flag1][i] + " ");

                    sum++;                

                }

                flag2=i-1;

                hang++;    //列印的列數加1        

            //3.從下到上列印列

                for(i=flag1-1;i>=start;i--){

                    System.out.print(a[i][flag2] + " ");

                flag1=i;    

                lie++;//列印的行數加1                

            }            

            //4.從右到左列印行

                for(i=flag2-1;i>start;i--){

                    System.out.print(a[start][i] + " ");

                hang++;    //列印的列數加1    

        System.out.println("一共列印了 "+sum+" 個元素");

    }    

}

本文轉自 碧雲天 51CTO部落格,原文連結:http://blog.51cto.com/333234/1784255,如需轉載請自行聯系原作者

繼續閱讀