Java 将深度优先搜索转换为深度受限搜索
这是我用java编写的完整代码,我想对其应用深度限制搜索。有人能帮我吗 输出:S>A>B>C>D>G 注:S(0)=开始,G(5)=目标 使用adj矩阵应用深度优先搜索Java 将深度优先搜索转换为深度受限搜索,java,depth-first-search,Java,Depth First Search,这是我用java编写的完整代码,我想对其应用深度限制搜索。有人能帮我吗 输出:S>A>B>C>D>G 注:S(0)=开始,G(5)=目标 使用adj矩阵应用深度优先搜索 import java.util.Stack; public class DFS { Stack<Integer> st; int vFirst; int[][] adjMatrix; int[] isVisited = new int[6]; /** * @param args */ pu
import java.util.Stack;
public class DFS {
Stack<Integer> st;
int vFirst;
int[][] adjMatrix;
int[] isVisited = new int[6];
/**
* @param args
*/
public static void main(String[] args) {
int[][] adjMatrix = {
//S, A, B, C, D, G,
{0, 1, 0, 1, 0, 0},
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
{0, 0, 1, 0, 1, 0},
};
new DFS(adjMatrix);
}
public DFS(int[][] Matrix) {
this.adjMatrix = Matrix;
st = new Stack<Integer>();
//int i;
int[] node = {0, 1, 2, 3, 4, 5};
int firstNode = node[0];
depthFirst(firstNode, 6);
}
public void depthFirst(int vFirst,int n)
{
int v,i;
char out=' ';
st.push(vFirst);
while(!st.isEmpty())
{
v = st.pop();
if(v==0)out='S';
else if(v==1)out='A';
else if(v==2)out='B';
else if(v==3)out='C';
else if(v==4)out='D';
else if(v==5)out='G';
if(isVisited[v]==0)
{
System.out.print("\n"+out);
isVisited[v]=1;
}
for ( i=0;i<n;i++)
{
if((adjMatrix[v][i] == 1) && (isVisited[i] == 0))
{
st.push(v);
isVisited[i]=1;
if(i==0)out='S';
else if(i==1)out='A';
else if(i==2)out='B';
else if(i==3)out='C';
else if(i==4)out='D';
else if(i==5)out='G';
System.out.print("-> " + out);
v = i;
}
}
}
}
}
import java.util.Stack;
公共类DFS{
斯塔克街;
int vFirst;
int[][]调整矩阵;
int[]isvisted=新int[6];
/**
*@param args
*/
公共静态void main(字符串[]args){
int[][]调整矩阵={
//S、 A,B,C,D,G,
{0, 1, 0, 1, 0, 0},
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
{0, 0, 1, 0, 1, 0},
};
新DFS(adjMatrix);
}
公共DFS(int[][]矩阵){
这个矩阵=矩阵;
st=新堆栈();
//int i;
int[]节点={0,1,2,3,4,5};
int firstNode=node[0];
深度优先(firstNode,6);
}
公共空间深度优先(内部空间优先,内部n)
{
int v,i;
字符输出=“”;
圣推(vFirst);
而(!st.isEmpty())
{
v=圣普();
如果(v==0)out='S';
如果(v==1)out='A';
如果(v==2)out='B';
如果(v==3)out='C';
如果(v==4)out='D';
如果(v==5)out='G';
如果(isVisited[v]==0)
{
系统输出打印(“\n”+输出);
[v]=1;
}
对于(i=0;i您可以使用临时类或ADT来存储从启动到节点的当前距离,当您将它们叠加(推送)时,可以添加curr distance+1(开始时距离=0)。当您弹出时,检查距离是否大于或小于最大值,然后继续。这就是我的想法
Curr Node,Curr Distance -> Stack <-
1st (S,0) -> (A,1) (C,1)
2nd (C,1) -> (A,1) (B,2) (D,2)
3rd (D,2) -> (A,1) (B,2) (A,3) (G,3)
4.... -> ....
当前节点,当前距离->堆栈(A,1)(C,1)
第二(C,1)->(A,1)(B,2)(D,2)
第三(D,2)->(A,1)(B,2)(A,3)(G,3)
4.... -> ....
(可能要跟踪,哪些在堆栈中或不在堆栈中…)
希望您理解我的建议,让我知道您的想法。您在
depthFirst
中已经有一个参数n
,您不使用它,每次调用depthFirst
时递减n
并在n==0
时返回您需要什么样的帮助?我不知道如何应用它,因为它是d定义为adj矩阵,也许我需要创建另一个称为Node的类?请您帮助修改我的代码,以便进一步理解您试图传达的内容。不,不,假设节点是矩阵中的索引,比如如果您想从i到j,您在i行,在j列中是值,所以您可以按:(i,curr\u distance+1)参数n应用于(i=0;i