今天同学给了个题目,做个数组螺旋排列,我是个新手,就想看看,努力了下,做了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(); } }}
相比起来,感觉第二个要紧凑点,逻辑也清晰些.大家还有什么高见的请多多指教!