关于数组螺旋排列的问题探讨

    技术2022-05-11  80

    今天同学给了个题目,做个数组螺旋排列,我是个新手,就想看看,努力了下,做了2个不同的算法,自我感觉第二个比较好,大家给点意见 .

    算法一:

    class Quear{ static int inputNumber=6; static int lastValue=0; static int[][] quear=new int[inputNumber][inputNumber];   static void waiWei(int i){  int subQuearRow=inputNumber-2*i;//子矩阵行数  int subQuearLine=subQuearRow;//子矩阵列数  int[] temp=new int[subQuearLine*4-4];//要填入二维数组外圈的值  //数组初始化  for(int k=0;k<temp.length;k++){   temp[k]=k+lastValue+1;  }  //开始填数  int row=i,line=i;//分别表示行和列  int pointer=0;//指向一维数组的元素  for(int c=0;c<subQuearLine;c++){   quear[row][line]=temp[c];   line++;   pointer=c;  }  line--;//上次循环中line超过了4,需要恢复到4.  //System.out.println("Debug:pointer="+pointer+"   "+temp[pointer]+"  "+line);  //转移方向  pointer++;  row++;  //初始化右列  for(int c=0;c<subQuearRow-1;c++){   quear[row][line]=temp[pointer];   row++;   pointer++;  }  //System.out.println("Debug:pointer="+pointer+"   "+temp[pointer]+"  "+row+"   "+line);  //初始化下行  row--;  line--;  for(int c=0;c<subQuearLine-1;c++){   quear[row][line]=temp[pointer];   line--;   pointer++;  }  //System.out.println("Debug:pointer="+pointer+"   "+temp[pointer]+"  "+row+"   "+line);  line++;  row--;  for(int c=0;c<subQuearRow-2;c++){   quear[row][line]=temp[pointer];   row--;   pointer++;  }  pointer--;  //System.out.println("Debug:pointer="+pointer);  lastValue=temp[pointer]; }  public static void main(String[] args){  int quearNumber=inputNumber/2;//矩阵个数  if(inputNumber%2==1)   quear[quearNumber][quearNumber]=inputNumber*inputNumber;  for(int i=0;i<quearNumber;i++){   waiWei(i);  }  //display.....  for(int c=0;c<inputNumber;c++){   for(int k=0;k<inputNumber;k++){    System.out.print(quear[c][k]+"   ");   }   System.out.println();  } }}

    算法二:

    class Quear1{ static int inputNumber=5; static boolean first=true; static int defaultNumber=1; static int[][] quear=new int[inputNumber][inputNumber]; static int lastWay=1; public static void dosth(){  int row=0,line=0;  for(int c=0;c<inputNumber*inputNumber;c++){   quear[row][line]=defaultNumber;   lastWay=ways(row,line);   switch(lastWay){    case 1:line++;break;    case 2:row++;break;    case 3:line--;break;    case 4:row--;break;    default : System.out.println("error");   }   defaultNumber++;  } } //判断方向的方法返回1,2,3,4分别代表右,下,左,上。 static int ways(int row,int line){  int result=lastWay;  switch(lastWay){   case 1:    {if((line==inputNumber-1)||(quear[row][line+1]!=0))     result=2;    break;}   case 2:    {if((row==inputNumber-1)||(quear[row+1][line]!=0))     result=3;    break;}   case 3:    {if((line==0)||(quear[row][line-1]!=0))     result=4;    break;}   case 4:    {if(quear[row-1][line]!=0)     result=1;    break;}   }   return result; }  public static void main(String[] args){  dosth();  //display.....  for(int c=0;c<inputNumber;c++){   for(int k=0;k<inputNumber;k++){    System.out.print(quear[c][k]+"   ");   }   System.out.println();  } }}

    相比起来,感觉第二个要紧凑点,逻辑也清晰些.大家还有什么高见的请多多指教!


    最新回复(0)