黑马程序员技术交流社区

标题: 深圳0422期学员的螺旋矩阵【任意行任意列】(三) [ [打印本页]

作者: 依秋无泪    时间: 2015-4-29 21:28
标题: 深圳0422期学员的螺旋矩阵【任意行任意列】(三) [
//第一个帖子:http://bbs.itheima.com/thread-192515-1-1.html
//第二个帖子:http://bbs.itheima.com/thread-192519-1-1.html
//今天学了面向对象,想把我的思路用面向对象表达出来,不知道有没有准确
//只写了Road类,>_<
//希望有面向对象的大牛指导我下
/**实现螺旋矩阵--------实现过程
*思路:1.将螺旋矩阵分成了4种情况  首先是往右走,然后是往下走,然后是往左走,然后是往上走,然后再往右走。。。。。
*      2.往右走:首先往右走,如果发现右边这样走是错的【超出数组界限或者右边已经有数了】,就退回,走对了就标记下【给标记数组赋值,同时记录坐标】
*                 然后要往下走,如果发现下边是不可以走的【超出数组界限或者下边已经有数了】,就不走了
*    3.往下走:首先往下走,如果发现下边这样走是错的【超出数组界限或者下边已经有数了】,就退回,走对了就标记下【给标记数组赋值,同时记录坐标】
*                 然后要往左走,如果发现左边是不可以走的【超出数组界限或者左边已经有数了】,就不走了
*    4.往左走:首先往左走,如果发现左边这样走是错的【超出数组界限或者左边已经有数了】,就退回,走对了就标记下【给标记数组赋值,同时记录坐标】
*                 然后要往上走,如果发现上边是不可以走的【超出数组界限或者上边已经有数了】,就不走了
*    5.往上走:首先往上走,如果发现上边这样走是错的【超出数组界限或者上边已经有数了】,就退回,走对了就标记下【给标记数组赋值,同时记录坐标】
*                 然后要往右走,如果发现右边是不可以走的【超出数组界限或者右边已经有数了】,就不走了
*面向对象的思考: 对象有谁?走的人,路
*                人 Person 类:
                  成员变量:private int x;private int y;//所在的坐标
*      成员方法:走路 boolean run(Road road)//road 是路的实例    走成功返回true ,否则返回 false
*          做标记 boolean setSign(Road road)//给路做标记 成功返回true 失败返回false
     路 Road 类  :
      成员变量:private int [][] road;//未做标记的路 默认没走过【0表示未走过】
         private int length;//路的长度
         private int wide;//路的宽度
      构造方法:Road(int length,int wide) {
         this.length=length;
         this.wide=wide;
         road=new int[length][wide];
          }
      成员方法:public boolean isRunding(int x,int y){}//该路是否有做标记,可以走返回true ,不可以走返回flase
         public void  show()//展示路的所有坐标
        再定义一个螺旋矩阵的规则类 :ScrewMatrixRegular
        private int direction;//默认走的方向为右 【定义枚举类型更合适,可惜我枚举还没去学】
               0-右  1下  2左  3 上
           private int key;//螺旋矩阵该有的值
     成员方法: public boolean isRight(Road road,Person person) //是否可以往右走
           public boolean  isLeft(Road road,Person person)//是否可以往左走
        public boolean isUpper(Road road,Person person) //是否可以往上走
           public boolean  isBelow(Road road,Person person)//是否可以往下走
           public boolean toRight(Road road,Person person) //key++ 往右走的实现,走失败则返回flase,成功返回true         
           public boolean  toBelow(Road road,Person person)//key++   往下走的实现,走失败返回flase,成功返回true
        public boolean  toLeft(Road road,Person person)//key++    往左走的实现,走失败返回flase,成功返回true
        public boolean toUpper(Road road,Person person) //key++  往上走的实现,走失败返回flase,成功返回true
        public void changeDirection()//改变方向的规则
    定义逻辑实现类: ScrewMatrixRealize  
           public void show(Person person,Road road)//显示螺旋矩阵
         
*/

/**
* 路 Road 类  :
*      成员变量:private int [][] road;//未做标记的路 默认没走过【0表示未走过】
*         private int length;//路的长度
*         private int wide;//路的宽度
*      构造方法:Road(int length,int wide) {
*         this.length=length;
*         this.wide=wide;
*         road=new int[length][wide];
*          }
*
*      成员方法:public boolean isRunding(int x,int y){}//该路是否有做标记,可以走返回true ,不可以走返回flase
*            
*          public void  show()//展示路的所有坐标
*/
class Road {
/**
*未做标记的路 默认没走过【0表示未走过】
*/
    int [][]road;
/**
*路的长度 x
*/
    private int length;
/**
*获取length
*/
public int getLength() {
  return this.length;
}
/**
*路的宽度 y
*/
private int wide;
/**
*获取wide
*/
public int getWide() {
  return wide;
}
/**
*构造函数
*/
    public  Road(int length,int wide) {
   this.length=length;
   this.wide=wide;
   road=new int[length][wide];
}
/**
*该路是否有做标记,可以走返回true ,不可以走返回flase
*@param x 路的x坐标
*@param y 路的y坐标
*/
public boolean isRunding(int x,int y) {
   if(x<this.length&&y<this.wide) {
   if(road[x][y]!=0) return true;
   } else System.out.println("该路不存在("+x+","+y+")坐标!");
   return false;
}
/**
*展示路的所有坐标
*/
  public void  show() {
  for(int y=0;y<this.wide;y++) {
    for(int x=0;x<this.length;x++)
     System.out.println(road[x][y]+"\t");
    System.out.println();
  }
  }
}


作者: 乘梦而飞    时间: 2015-4-29 21:30
我路过看看
作者: 晏慎磊    时间: 2015-4-29 21:30
顶一个,小板凳前排入座!
作者: 火云邪神    时间: 2015-4-29 21:33
我是路过的
作者: 逸风    时间: 2015-4-29 21:33
技术贴!顶起
作者: joyjio    时间: 2015-4-29 21:37
人才!赞一下!
作者: Oh.Ba    时间: 2015-4-29 21:46
路过。看不懂
作者: 魔心邪    时间: 2015-4-29 21:49
好得很,不过没学到呢
作者: 黑影    时间: 2015-4-29 21:59
研究中,前排学习
作者: rolan    时间: 2015-4-29 22:03
顶。楼主棒棒哒
作者: gainn    时间: 2015-4-29 22:04
技术贴,必须顶!0422要出大牛啊!
作者: exist    时间: 2015-4-29 22:04
值得学习!
作者: lixiaominls    时间: 2015-4-29 22:05
顶楼主 ~
作者: xuelanghu120    时间: 2015-4-29 22:06
牛逼,思路 很清晰
作者: 陈锐涛    时间: 2015-4-29 22:07
路过 起码我现在还不会~
作者: lzh2015    时间: 2015-4-29 22:09
猴赛雷,每次看到这么长的代码,就不是很有心情

作者: 依秋无泪    时间: 2015-4-29 22:12
lzh2015 发表于 2015-4-29 22:09
猴赛雷,每次看到这么长的代码,就不是很有心情

写着写着就这么长了,其实也不是很长
作者: xiaowen_wu    时间: 2015-4-29 22:26
大神,求带飞、、
作者: ailj_2015    时间: 2015-4-29 22:29
502黄大神发帖,菜j前来顶贴!
作者: 黄文昭    时间: 2015-4-29 22:33
表示看懂有压力!真牛叉!
作者: kk8023    时间: 2015-4-29 23:01
小勇,66666
作者: 一诺珍惜    时间: 2015-4-29 23:15
厉害,好久没看到这么厉害的大牛了
作者: pengcheng0328    时间: 2015-4-29 23:18
        //输出 n=5 的螺旋方阵,下面是获取方法
        public static void getScrew(int n) {
                int[][] arr = new int[n][n];//创建二维数组
                int temp = 0;//数组中元素的初始值
                //计算螺旋数组转的圈数x
                int x;
                if (n%2==0) {
                        x = n/2;
                } else {
                        x = n/2+1;
                }
                //思路创建二维数组arr[a][b]
                for (int y = 0; y < x; y++) {//以圈数为循环
                        //上循环,从左到右;数组arr[y][a]----y不变,a++
                        for (int a = y; a < n-y ; a++) {
                                temp++;
                                arr[y][a] = temp;
                        }
                        //右循环,从上到下;数组arr[b][n-y-1]----b++;n-y-1不变
                        for (int b = y+1; b < n-y-1; b++) {
                                temp++;
                                arr[b][n-y-1] = temp;
                        }
                        //下循环,从右到左;数组arr[n-y-1][c]----n-y-1不变;c--
                        for (int c = n-y-1; c > y; c--) {
                                temp++;
                                arr[n-y-1][c] = temp;
                        }
                        //左循环,从下到上;数组arr[d][y]----d--;y不变
                        for (int d = n-y-1; d > y; d--) {
                                temp++;
                                arr[d][y] = temp;
                        }
                }
                //对数组进行输出
                for (int i = 0; i < arr.length; i++) {
                        for (int j = 0; j < arr.length; j++) {
                                System.out.print(arr[i][j]+"\t");
                        }
                        System.out.println();
                }
        }
作者: 精湛学术    时间: 2015-4-29 23:25
这个代码有点难
作者: lclxjzz    时间: 2015-4-29 23:32
大神 求带飞啊
作者: 依秋无泪    时间: 2015-4-29 23:36
pengcheng0328 发表于 2015-4-29 23:18
//输出 n=5 的螺旋方阵,下面是获取方法
        public static void getScrew(int n) {
                int[][] arr = n ...

这些代码在我第二个帖子有写出来了,自己想的任意行任意列的螺旋矩阵,但是有个BUG不知道怎么改过来,任意行列的代码其实挺好理解的
作者: 依秋无泪    时间: 2015-4-29 23:40
一诺珍惜 发表于 2015-4-29 23:15
厉害,好久没看到这么厉害的大牛了

不是大牛,只是一个在学习成长中的宅男,努力成为个技术宅
作者: 依秋无泪    时间: 2015-4-29 23:41
lclxjzz 发表于 2015-4-29 23:32
大神 求带飞啊

前提是我会飞啊,一起加油吧
作者: 牛奋    时间: 2015-4-30 00:03
路过看看
作者: 横看成岭侧成锋    时间: 2015-4-30 10:45
非常给力
作者: 横看成岭侧成锋    时间: 2015-4-30 10:48
看晕了,不懂
作者: Chans_宇    时间: 2015-4-30 11:27
本帖最后由 Chans_宇 于 2015-4-30 11:29 编辑

关于螺旋方阵的有想过,分步遍历赋值想法很好,可以实现任意规律链式排序方阵,不考虑内存资源占用的话,这确实是很好的方法,用分步去实现由繁琐到简单的操作,但明确需求时直接用逻辑语句写的方法运行效率是最高的(反正我这么理解),我也发过类似的贴子,你可以参考下,但只是实现正方阵(行列相等)的情况,反正俺是不打算继续深入去探究了,后面的学习任务很重:'(。
友情链接:http://bbs.itheima.com/thread-191648-1-1.html
作者: 付长云    时间: 2015-4-30 12:50
顶++++++++++++++++111




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