随着编程的学习和工作,感触越来越深的,就是如何做好对需求的理解。那么在学习的过程中,就是如何将一个实际问题,转化成计算机语言去实现。我觉得我的这方面的能力很是欠缺啊。
今天分享一下一个螺旋数组例子的分析:
贴上code:
package excesize;
/*
* 螺旋数组:
* 4
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*/
public class LuoxuanArray {
public static void main(String[] args){
int len=4;
int[][] arr=luoxuanStart(len);
for(int i=0;i<len;i++){
for(int j=0;j<len;j++)
{
System.out.print(+arr[i][j]+"\t");
}
System.out.println();
}
}
public static int[][] luoxuanStart(int len){
/*
* 定义一个整形方向变量,默认值为:0
* 0:向右;1:向下;2:向左;3:向上
*/
final int toRight=0;//为什么要定义成final类型
final int toDown=1;
final int toLeft=2;
final int toUp=3;
int currentDirection=toRight;
//定义一个二维数组,用于存放二维的螺旋数组值
int x=0,y=0;//定义二维数组的下标
int[][] luoxuan=new int[len][len];
for(int i=1;i<=len*len;i++){//----------------------------------for
//给当前坐标赋值
luoxuan[x][y]=i;
//计算下一个正确坐标-这个坐标不一定正确,所以先将此坐标的位置
int tempX = x;
int tempY = y;
//根据当前的方向确定下一个位置的坐标--------switch
switch (currentDirection){
case toRight:{
tempY++;
break;
}
case toDown:{
tempX++;
break;
}
case toLeft:{
tempY--;
break;
}
case toUp:{
tempX--;
break;
}
}//-----------------------------switch
//2.2、下一个坐标如果正确,就赋值。否则,就转向,并赋值。
/*
* 坐标值在正确的范围,并且该坐标未被赋过值,才是正确的坐标值
*/
if(tempX>=0 && tempX<len && tempY>=0 && tempY<len && luoxuan[tempX][tempY]==0){
//如果是正确的坐标,将临时坐标赋给实际坐标
x=tempX;
y=tempY;
}else{
//开始转向 下一个方向 = (curDir+1)%4
currentDirection=(currentDirection+1)%4;//四个方向
switch (currentDirection){
case toRight:{
y++;
break;
}
case toDown:{
x++;
break;
}
case toLeft:{
y--;
break;
}
case toUp:{
x--;
break;
}
}//-------------------switch
}//-----------------------------------if
}//------------------------------------------------------for
return luoxuan;
}//-----------------------------------------------------------------------luoxuanStart
}