顺时针和逆时针螺旋打印二维数组(行列式)

  • Post author:
  • Post category:其他



一.要求:

行列式,行和宽不一定相等,要求顺时针螺旋打印每一个元素,所谓顺时针螺旋即:

第一圈:从第一行第一列元素开始,先从左到右打印第一行所有元素,接着打印最后一剩余列元素,再从右到左打印最后一行剩余元素,接着从下到上打印第一列剩余元素

第二圈:从第二行第二列开始,按上面的顺时针顺序打印一圈元素

…,一圈圈反复,直到把所有元素无重复的打印完。

逆时针螺旋与上面的顺序刚好相反。


二.分析:

顺时针螺旋打印可以将问题分割为:先按顺时针打印第一圈,再按顺时针打印第二圈,其中每圈又分四个步骤:从左到右,从上到下,从右到左,从下到上。

逆时针螺旋打印可以将问题同样分割为:先按逆时针打印第一圈,再按拧时针打印第二圈,其中每圈又分四个步骤:从上到下,从左到右,从下到上,从右到左。


三.代码:

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 i=0;i<line;i++){


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.从右到左打印行

if(hang<len){


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


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

sum++;

}

flag1=i;

hang++;//打印的行数加1

}

//4.从下到上打印列

if(lie<col){


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


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

sum++;

}

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.从下到上打印列

if(lie<col){


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


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

sum++;

}

flag1=i;

lie++;//打印的行数加1

}

//4.从右到左打印行

if(hang<len){


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


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

sum++;

}

hang++;    //打印的列数加1

}

System.out.println(“一共打印了 “+sum+” 个元素”);

}

}

}



版权声明:本文为weixin_34342578原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。