花了我七个小时终于做出来了,真是功夫不负有心人。
/**
*题目: 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
* 分析:这道题花了我六七个小时终于弄出来了,我的思路是这样的:
* ( 本人原创 )根据题目要求路线的的方向是顺时针循环,那么路线就是有顺序的,向右的下一条路线是向下,再下一条是向左,再下一条是向上,然后再向右,
* 如此循环往复,那么就可以想到用前几天学过的交通灯中用过的枚举来做这道题,通过当前路线dir.getNext()方法获取下一条路线方向,
* 下一个位置的元素存在也就是不为零那么接着获取下一条路线,遇到数组边界或者前面的位置有元素就顺时针拐弯,一直到数组的
* 最大元素被添加进去就gameover了。
*
* */
public enum Direction {
RIGHT,DOWN,LEFT,UP;
public Direction getNext()
{
switch(this)
{
case RIGHT:
return DOWN;
case DOWN:
return LEFT;
case LEFT:
return UP;
case UP:
return RIGHT;
}
return null;
}
}
public class Test9 {
public static void main(String[] args) {
int n=6;//数组长度
int[][] arr=new int[n][n];
arr[0][0]=1;
new SnakeDemo(arr,n).snake();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
class SnakeDemo
{
private Direction dir=Direction.RIGHT;//默然初始方向
private int[][] arr=null;
private int n;
private int temp=1;
private int x=0;int y=0;
SnakeDemo(int[][] arr,int n)
{
this.arr=arr;
this.n=n;
}
public void snake()
{
switch(dir)
{
case RIGHT://向右前进 ,前进就是数组x/y角标在递增/递减,是由前进的方向来决定的
for(x=x+1;x<n;x++)
{
if(arr[y][x]!=0)//如果此位置有元素存在
{
dir=dir.getNext();//获取下一个方向
x=x-1;//退回到刚才位置准备拐弯
if(temp<n*n)//如果数组还没有被填满,防止死循环
snake();//再接着运行这个方法
break;
}
else//此位置还是空的
{
temp=temp+1;//数组的上一个元素的值加1,保证元素递增
arr[y][x]=temp;//给数组当前位置赋值
}
}
if(x==n)//如果越界了
{
x=x-1;//后退一步
dir=dir.getNext();//获取下一个方向
snake();//再运行这个方法
}
break;
case DOWN://开始向下前进
for(y=y+1;y<n;y++)//y角标在递增
{
if(arr[y][x]!=0)
{
dir=dir.getNext();
y=y-1;
if(temp<(n*n))
snake();
break;
}
else
{
temp=temp+1;
arr[y][x]=temp;//4 5
}
}
if(y==n)
{
y=y-1;
dir=dir.getNext();
snake();
}
break;
case LEFT://向左前进,x角标递减
for(x=x-1;x>=0;x--)//x=2,y=2
{
if(arr[y][x]!=0)
{
dir=dir.getNext();
x=x+1;
if(temp<(n*n))
snake();
break;
}
else
{
temp=temp+1;
arr[y][x]=temp;
}
}
if(x==-1)//如果越界
{ x=x+1;//后退一步
dir=dir.getNext();//获取下一个方向
snake();
}
break;
case UP://向上前进 y角标在递减
for(y=y-1;y>=0;y--)//y=1 x=0
{
if(arr[y][x]!=0)//如果这个位置存在元素
{
y=y+1;//后退一步
dir=dir.getNext();//获取下一个方向
if(temp<=(n*n))
snake();
break;
}
else
{
temp=temp+1;
arr[y][x]=temp;
}
}
break;
}
}
}
|