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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//第一个帖子: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();
  }
  }
}

评分

参与人数 4黑马币 +21 收起 理由
黄小橙 + 5 很给力!
lclxjzz + 5 很给力!
曹小不 + 6 赞一个!
kk8023 + 5 很给力!

查看全部评分

33 个回复

正序浏览
顶++++++++++++++++111
回复 使用道具 举报
本帖最后由 Chans_宇 于 2015-4-30 11:29 编辑

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

点评

参考相互学习下  发表于 2015-4-30 12:21
回复 使用道具 举报
看晕了,不懂
回复 使用道具 举报
非常给力
回复 使用道具 举报
牛奋 来自手机 中级黑马 2015-4-30 00:03:03
29#
路过看看
回复 使用道具 举报

前提是我会飞啊,一起加油吧
回复 使用道具 举报
一诺珍惜 发表于 2015-4-29 23:15
厉害,好久没看到这么厉害的大牛了

不是大牛,只是一个在学习成长中的宅男,努力成为个技术宅
回复 使用道具 举报
pengcheng0328 发表于 2015-4-29 23:18
//输出 n=5 的螺旋方阵,下面是获取方法
        public static void getScrew(int n) {
                int[][] arr = n ...

这些代码在我第二个帖子有写出来了,自己想的任意行任意列的螺旋矩阵,但是有个BUG不知道怎么改过来,任意行列的代码其实挺好理解的
回复 使用道具 举报
大神 求带飞啊
回复 使用道具 举报
这个代码有点难
回复 使用道具 举报
        //输出 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();
                }
        }
回复 使用道具 举报
厉害,好久没看到这么厉害的大牛了
回复 使用道具 举报
小勇,66666
回复 使用道具 举报
表示看懂有压力!真牛叉!
回复 使用道具 举报
502黄大神发帖,菜j前来顶贴!
回复 使用道具 举报
大神,求带飞、、
回复 使用道具 举报
lzh2015 发表于 2015-4-29 22:09
猴赛雷,每次看到这么长的代码,就不是很有心情

写着写着就这么长了,其实也不是很长
回复 使用道具 举报
猴赛雷,每次看到这么长的代码,就不是很有心情
回复 使用道具 举报
路过 起码我现在还不会~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马