问题描述
我有一个城市的7x7网格。我想从起点(x1,y1)
到终点(x2,y2)
,并以逗号分隔的多个(x,y)
字符串的形式显示 path 作为输出。我想使用 RECURSION 进行此操作,如果路径存在则输出true,否则输出false。
我该怎么办?我正在考虑采用4种方法来检查4个方向。任何输入将不胜感激。
目前,我刚刚实现了我的课程的构造函数:-
map = new boolean[row][column];
for(int i = 0; i < 7; i++)
{
for(int j = 0; j < 7; j++)
{
map[i][j] = false;
}
}
解决方法
import java.io.PrintStream;
/**
* Dev Parzival
* Date : 27/10/2020 Time : 18:28
* I have a confidence about my life that comes from standing tall on my own two feet.
*/
public class Path {
static PrintStream out=System.out;
static boolean pathfound=false;
//////////Main/////////
public static void main(String $[]){
boolean arr[][]=new boolean[5][5];
for(int i=0;i<arr.length;i++)
for(int j=0;j<arr[0].length;j++) {
if (i==0)
arr[i][j] = true;
if(j==arr[0].length-1)
arr[i][j]=true;
}
travel(arr,arr.length-1,arr[0].length-1);
if(pathfound)
out.println("Path is found");
else
out.println("Path is not found");
}
static boolean travel(boolean a[][],int r,int c,int targetR,int targetC){
//Target is found
if(r==targetR && c==targetC){
pathfound=true;
}
//South
if(!pathfound && r+1<a.length)
if(a[r+1][c]){
a[r+1][c]=false;
pathfound=travel(a,r+1,c,targetR,targetC);
}
//North
if(!pathfound && r-1>=0)
if(a[r-1][c]){
a[r-1][c]=false;
pathfound=travel(a,r-1,targetC);
}
//East
if(!pathfound && c+1<a[0].length)
if(a[r][c+1]){
a[r][c+1]=false;
pathfound=travel(a,r,c+1,targetC);
}
//West
if(!pathfound && c-1>=0)
if(a[r][c-1]){
a[r][c-1]=false;
pathfound=travel(a,c-1,targetC);
}
if(pathfound)
out.println(r+" "+c);
return pathfound;
}
}
我建议您复制原始数组,以便不会修改值。
我已经测试过上述代码可以正常工作。这种方法称为flood fill
。在depth first search
graph.
的更多信息
,
import java.io.PrintStream;
/**
* Dev Parzival
* Date : 27/10/2020 Time : 18:28
* I have a confidence about my life that comes from standing tall on my own two feet.
*/
public class Path {
static PrintStream out=System.out;
static boolean pathfound=false;
//////////Main/////////
public static void main(String $[]){
boolean arr[][]=new boolean[5][5];
for(int i=0;i<arr.length;i++)
for(int j=0;j<arr[0].length;j++) {
if (i==j)
arr[i][j] = true;
// if(j==arr[0].length-1)
// arr[i][j]=true;
}
travel(arr,arr[0].length-1);
if(pathfound)
out.println("Path is found");
else
out.println("Path is not found");
}
static boolean travel(boolean a[][],int targetC){
//Target is found
if(r==targetR && c==targetC){
pathfound=true;
}
//South
if(!pathfound && r+1<a.length)
if(a[r+1][c]){
a[r+1][c]=false;
pathfound=travel(a,targetC);
}
//North
if(!pathfound && r-1>=0)
if(a[r-1][c]){
a[r-1][c]=false;
pathfound=travel(a,targetC);
}
//East
if(!pathfound && c+1<a[0].length)
if(a[r][c+1]){
a[r][c+1]=false;
pathfound=travel(a,targetC);
}
//West
if(!pathfound && c-1>=0)
if(a[r][c-1]){
a[r][c-1]=false;
pathfound=travel(a,targetC);
}
//North-West
if(!pathfound && c-1>=0 && r-1>=0)
if(a[r-1][c-1]){
a[r-1][c-1]=false;
pathfound=travel(a,targetC);
}
//Noth-East
if(!pathfound && c+1<a[0].length && r-1>=0)
if(a[r-1][c+1]){
a[r-1][c+1]=false;
pathfound=travel(a,targetC);
}
//South-East
if(!pathfound && c+1<a[0].length && r+1<a.length)
if(a[r+1][c+1]){
a[r+1][c+1]=false;
pathfound=travel(a,targetC);
}
//South-West
if(!pathfound && c-1>=0 && r+1<a.length)
if(a[r+1][c-1]){
a[r+1][c-1]=false;
pathfound=travel(a,targetC);
}
//Print the cell position
if(pathfound)
out.println(r+" "+c);
return pathfound;
}
}
以上代码将在起始单元格和目标单元格之间找到一条路径。
它生成的输出:
4 4
3 3
2 2
1 1
0 0
Path is found