Java 打印从任意点到网格外的任何退出路径?

Java 打印从任意点到网格外的任何退出路径?,java,algorithm,graph,depth-first-search,Java,Algorithm,Graph,Depth First Search,这个问题是在采访中提出的。给定网格4X4,您将给出一些任意点假设点(2,2)(索引从0开始),从这里开始,打印一条任意路径,从这里您可以退出网格。您可以移动左,右,上,下。在下面的网格中,1-表示块,0:可以移动 1011 0 10101 1 上述网格的退出路径为,(2,2)=>(1,2)=>(1,1)=>(0,1) 我试图通过DFS解决这个问题(以下),但我无法找到如何打印任何一条路径的解决方案,下面是打印所有路径,我只想打印任何路径 public boolean isValidMove(Po

这个问题是在采访中提出的。给定网格4X4,您将给出一些任意点假设点(2,2)(索引从0开始),从这里开始,打印一条任意路径,从这里您可以退出网格。您可以移动。在下面的网格中,1-表示块,0:可以移动

1011
0
10101
1

上述网格的退出路径为,(2,2)=>(1,2)=>(1,1)=>(0,1)

我试图通过DFS解决这个问题(以下),但我无法找到如何打印任何一条路径的解决方案,下面是打印所有路径,我只想打印任何路径

public boolean isValidMove(Point point){
   if(array[point.getX()][point.getY()]==0){
      return true;
   }
   return false;
}

public void printTraversal(int [][] array, int M, int N, Point start){
    boolean [] visited = boolean[M*N];
    Arrays.fill(visited, false);
    int index = start.getX()*M+ start.getY();
    boolean[index] = true;
    Stack<Point> stack = new Stack<Point>();
    stack.push(start);
    while(!stack.isEmpty()){
        Point point = stack.pop();
        System.out.println(point.getX()+", "+ point.getY());
        int x = point.getX();
        int y = point.getY();
        if(isValidMove(x-1, y-1)){
            stack.push(new Point(x-1, y-1));
        }
        if(isValidMove(x-1, y)){
            stack.push(new Point(x-1, y));
        }
        if(isValidMove(x, y-1)){
            stack.push(new Point(x, y-1));
        }
        if(isValidMove(x+1, y+1)){
            stack.push(new Point(x+1, y+1));
        }
    }
}
class Point{
   private int X;
   private int Y;
   public Point(int X, int Y){
      this.X = X;
      this.Y = Y;
   }
   public int getX(){
      return this.X;
   }
   public int getY(){
      return this.Y;
   }

}
公共布尔值isValidMove(点){
if(数组[point.getX()][point.getY()]==0){
返回true;
}
返回false;
}
公共void打印遍历(int[][]数组、int M、int N、Point start){
boolean[]访问=boolean[M*N];
数组。填充(已访问,错误);
int index=start.getX()*M+start.getY();
布尔[索引]=真;
堆栈=新堆栈();
堆栈推送(启动);
而(!stack.isEmpty()){
Point=stack.pop();
System.out.println(point.getX()+”,“+point.getY());
int x=point.getX();
int y=point.getY();
if(isValidMove(x-1,y-1)){
堆栈推送(新点(x-1,y-1));
}
if(isValidMove(x-1,y)){
叠加推(新点(x-1,y));
}
if(isValidMove(x,y-1)){
叠加推(新点(x,y-1));
}
if(isValidMove(x+1,y+1)){
堆栈推送(新点(x+1,y+1));
}
}
}
类点{
私人INTX;
私营企业;
公共点(整数X,整数Y){
这个.X=X;
这个。Y=Y;
}
公共int getX(){
归还这个.X;
}
公共int getY(){
把这个还给我;
}
}

您需要另一个实用程序功能来检查当前点是否即将退出

public boolean isExit(Point point, int M, int N) {
  int x = Point.getX();
  int y = point.getY();

  return (x == 0 || y == 0 || x == M - 1 || y == N - 1);
}
现在在while循环中,当您遇到退出点时,打印并退出循环。您还需要稍微更正
isValidMove
printTraversal
函数

public boolean isValidMove(Point point, int M, int N) {
    int x = Point.getX();
    int y = point.getY();

    if(x >= 0 && y >= 0 && x < M && y < N && array[x][y] == 0 ) {
       return true;
    }
    return false;
}

private int getIndx(Point p, int M) {
    return p.getX() * M + p.getY();
}

public void printTraversal(int [][] array, int M, int N, Point start){
    if(M == 0 || N == 0) {
        return;
    }
    boolean [] visited = boolean[M * N];
    Arrays.fill(visited, false);
    visited[ getIndx(start, M) ] = true;
    Stack<Point> stack = new Stack<Point>();
    stack.push(start);

    while(!stack.isEmpty()) {
        Point point = stack.pop();
        System.out.println(point.getX()+", "+ point.getY());
        if(isExit(point, M, N)) 
            break;
        int x = point.getX();
        int y = point.getY();

        Point neigh = new Point(x-1, y-1); 
        if(isValidMove(x-1, y-1, M, N) && !visited[ getIndx(neigh, M) ]){
            stack.push( neigh );
            visited[ getIndx(neigh, M) ] = true;
        }

        // For other 3 sides
        // .............
    }
}
public boolean isValidMove(Point-Point,int-M,int-N){
int x=Point.getX();
int y=point.getY();
如果(x>=0&&y>=0&&x
回答得不错。顺便说一句,这个问题是否应该标记为“Java”?@AmiTavory谢谢,我已经在这个问题上添加了标签
Java
。请查看我的最新答案。我简化了它。