A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨栋 中级黑马   /  2013-9-3 09:57  /  3421 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

花了我七个小时终于做出来了,真是功夫不负有心人。

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

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

16 个回复

倒序浏览
额,不错,很熟悉的楼主名字
回复 使用道具 举报
前来围观一记!
回复 使用道具 举报

你想进哪一期?
回复 使用道具 举报
本帖最后由 T-McGrady 于 2013-9-4 09:34 编辑

你走25期吗?
回复 使用道具 举报

本来是打算进24期的可是名额已经满了,老师说让我进25期{:soso_e105:}
回复 使用道具 举报
杨栋 发表于 2013-9-4 10:04
本来是打算进24期的可是名额已经满了,老师说让我进25期

加油!你这25期,妥妥的!
回复 使用道具 举报
T-McGrady 发表于 2013-9-4 10:06
加油!你这25期,妥妥的!

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

回复 使用道具 举报
你这螺旋数组写的怎么跟我见到的那本书里的例子差不多啊,都是定义4个方向。。
回复 使用道具 举报
肥猫 发表于 2013-9-4 13:08
你这螺旋数组写的怎么跟我见到的那本书里的例子差不多啊,都是定义4个方向。。 ...

真的么?书里也有这种题?
回复 使用道具 举报
杨栋 发表于 2013-9-4 16:43
真的么?书里也有这种题?

真的有啊,书名好像叫JAVA编程那些事儿。好像是这本。
上面的方法还和你的很像啊。
回复 使用道具 举报
肥猫 发表于 2013-9-4 16:52
真的有啊,书名好像叫JAVA编程那些事儿。好像是这本。
上面的方法还和你的很像啊。
...

我汗{:soso_e122:}...,难道我都可以写书了么
回复 使用道具 举报
肥猫 发表于 2013-9-4 16:52
真的有啊,书名好像叫JAVA编程那些事儿。好像是这本。
上面的方法还和你的很像啊。
...

我在网上搜这本书了 没有这样的题,估计你记错了{:soso_e141:}
回复 使用道具 举报
来,围观你们!
回复 使用道具 举报
学习了!很是佩服!
回复 使用道具 举报
学习一下
回复 使用道具 举报
很值得学习的方法,就是代码复用性差了点
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马