黑马程序员技术交流社区

标题: 上次考试自己做的盘蛇形二维数组 [打印本页]

作者: 杨栋    时间: 2013-9-3 09:57
标题: 上次考试自己做的盘蛇形二维数组
花了我七个小时终于做出来了,真是功夫不负有心人。

/**
*题目: 写一方法,打印等长的二维数组,要求从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;
        }
        
    }
}


作者: 吴光新    时间: 2013-9-4 01:17
额,不错,很熟悉的楼主名字
作者: T-McGrady    时间: 2013-9-4 09:15
前来围观一记!
作者: 杨栋    时间: 2013-9-4 09:20
T-McGrady 发表于 2013-9-4 09:15
前来围观一记!

你想进哪一期?

作者: T-McGrady    时间: 2013-9-4 09:24
本帖最后由 T-McGrady 于 2013-9-4 09:34 编辑

你走25期吗?
作者: 杨栋    时间: 2013-9-4 10:04
T-McGrady 发表于 2013-9-4 09:24
你走25期吗?

本来是打算进24期的可是名额已经满了,老师说让我进25期{:soso_e105:}

作者: T-McGrady    时间: 2013-9-4 10:06
杨栋 发表于 2013-9-4 10:04
本来是打算进24期的可是名额已经满了,老师说让我进25期

加油!你这25期,妥妥的!

作者: 杨栋    时间: 2013-9-4 10:53
T-McGrady 发表于 2013-9-4 10:06
加油!你这25期,妥妥的!

就是又耽误了一个月时间,你呢 什么打算


作者: 肥猫    时间: 2013-9-4 13:08
你这螺旋数组写的怎么跟我见到的那本书里的例子差不多啊,都是定义4个方向。。
作者: 杨栋    时间: 2013-9-4 16:43
肥猫 发表于 2013-9-4 13:08
你这螺旋数组写的怎么跟我见到的那本书里的例子差不多啊,都是定义4个方向。。 ...

真的么?书里也有这种题?

作者: 肥猫    时间: 2013-9-4 16:52
杨栋 发表于 2013-9-4 16:43
真的么?书里也有这种题?

真的有啊,书名好像叫JAVA编程那些事儿。好像是这本。
上面的方法还和你的很像啊。

作者: 杨栋    时间: 2013-9-4 18:21
肥猫 发表于 2013-9-4 16:52
真的有啊,书名好像叫JAVA编程那些事儿。好像是这本。
上面的方法还和你的很像啊。
...

我汗{:soso_e122:}...,难道我都可以写书了么

作者: 杨栋    时间: 2013-9-4 18:27
肥猫 发表于 2013-9-4 16:52
真的有啊,书名好像叫JAVA编程那些事儿。好像是这本。
上面的方法还和你的很像啊。
...

我在网上搜这本书了 没有这样的题,估计你记错了{:soso_e141:}

作者: yinxjfly    时间: 2014-5-31 19:41
来,围观你们!
作者: yinxjfly    时间: 2014-5-31 19:44
学习了!很是佩服!
作者: qfch    时间: 2014-6-5 19:34
学习一下
作者: Kikyou2014    时间: 2014-11-6 12:42
很值得学习的方法,就是代码复用性差了点




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2