Java 打印从任意点到网格外的任何退出路径?
这个问题是在采访中提出的。给定网格4X4,您将给出一些任意点假设点(2,2)(索引从0开始),从这里开始,打印一条任意路径,从这里您可以退出网格。您可以移动左,右,上,下。在下面的网格中,1-表示块,0:可以移动 1011Java 打印从任意点到网格外的任何退出路径?,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
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
。请查看我的最新答案。我简化了它。