给定算法的变化很小

时间:2016-05-27 19:30:03

标签: java algorithm

这是关于改变迷宫算法。

我的意思是什么?我们得到了一个填充0和1的二维数组,其中0代表“不可能通过”,1代表“可能通过”。 该算法从x到y找到它的方式(也称为例如:cat to mouse)。 这正是以下算法正在做的事情。

作为输入我们得到了:

{1, 0, 0,},
{1, 1, 0},
{0, 1, 1} };

输出:

(0,0) // ressembles the coordinates of the 1 in top left corner 
(1,0) // ressembles the 1 under the first 1 I just explained
(1,1) // ...
(2,1)
(2,2)

我想改变一些小事:

  1. 更改起始位置和结束位置(此算法从左上角开始,在右下角结束) - 我希望我的左下角开始,右上角结束。
  2. 此算法只能向下和向右移动 - 我只想向上和向右移动。
  3. 需要做哪些更改,我很确定,但我不知道如何编写代码: 对于1.)问题似乎是:

    public List<Coordinate> solve() {
            return getMazePath(0, 0, new Stack<Coordinate>());
        }
    

    不知何故,我需要用第二个0做0-1但是如果我没有访问x和y声明怎么办?我真的相信0-1会让我从左下角而不是左上角开始,是吗?

    对于2.)列的更改,也称为y需要完成。 它需要-1而不是+1,是吗?

    对不起那段文字,我真的试着保持简短,但我似乎失败了:P 无论如何,我希望有人会读到这个^^

    没有变化的算法:

    import java.util.Arrays;
    import java.util.*;
    
    final class Coordinate {
        private final int x;
        private final int y;
    
        public Coordinate(int x, int y) {
            this.x = x; 
            this.y = y;
        }
    
        public int getX() {
            return x;
        }
    
        public int getY() {
            return y;
        }
    }
    
    public class Alg {
    
        private final int[][] maze;
    
        public Alg(int[][] maze) {
            if (maze == null) {
                throw new NullPointerException("The input maze cannot be null");
            }
            if (maze.length == 0) {
                throw new IllegalArgumentException("The size of maze should be greater than 0");
            }
    
            this.maze = maze;
        }
    
        public List<Coordinate> solve() {
            return getMazePath(0, 0, new Stack<Coordinate>());
        }
    
        private List<Coordinate> getMazePath(int row, int col, Stack<Coordinate> stack) {
            assert stack != null;
    
            stack.add(new Coordinate(row, col));
    
            if ((row == maze.length - 1) && (col == maze[0].length - 1)) {
                Coordinate[] coordinateArray = stack.toArray(new Coordinate[stack.size()]);
                return Arrays.asList(coordinateArray);
            }
    
            for (int j = col; j < maze[row].length; j++) {
    
                if ((j + 1) < maze[row].length && maze[row][j + 1] == 1) {
                    return getMazePath(row, j + 1, stack);
                }
    
                if ((row + 1) < maze.length && maze[row + 1][col] == 1) {
                    return getMazePath(row + 1, col, stack);
                }
            }
    
            return Collections.emptyList();
        }
    
    
        public static void main(String[] args) {
            int[][] m = {  {1, 0, 0,},
                           {1, 1, 0},
                           {0, 1, 1} };
    
            Alg maze = new Alg(m);
    
            for (Coordinate coord :  maze.solve()) {
                System.out.println("("+coord.getX() + "," + coord.getY()+")");
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

查看getMazePath的方法声明。当前的0,0作为rowcol传递给该参数。因此,不是向当前编码的方法发送0,0,而是发送2,0(对于第2行,第0列,左下角)。

方向移动位于for方法内的getMazePath()循环中,两个if语句检查列j + 1中是否有1(右边的列)或行row + 1(当前行下方的行)。您可以修改那些使用减号而不是加号来分别向左或向上移动。