Java 邻接矩阵的宽度优先算法:搜索提前结束,返回大小为1的队列?

Java 邻接矩阵的宽度优先算法:搜索提前结束,返回大小为1的队列?,java,algorithm,graph,breadth-first-search,adjacency-matrix,Java,Algorithm,Graph,Breadth First Search,Adjacency Matrix,adj是一个邻接矩阵: 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 adj映射下面迷宫的邻接关系(元素#位于一侧): 我用邻接矩阵遍历迷宫中的元素。这里有一个遍历矩阵的广度优先搜索算法 queue Q

adj
是一个邻接矩阵:

0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 
1 0 0 0 1 0 1 0 0 
0 0 0 1 0 1 0 0 0 
0 0 1 0 1 0 0 0 1 
0 0 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 
adj
映射下面迷宫的邻接关系(元素#位于一侧):

我用邻接矩阵遍历迷宫中的元素。这里有一个遍历矩阵的广度优先搜索算法

queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private queue BFS(int[][] adj, int begin) {
    visited[begin] = true;
    Q.enqueue(begin);
    while (!Q.isEmpty()) {
        int element = Q.dequeue();
        int temp = element;
        while (temp <= num) {
            if ((!visited[temp]) && (adj[element][temp] == 1)) {
                if (temp == end) {
                    return Q;
                }
                Q.enqueue(temp);
                visited[temp] = true;
            }
            temp++;
        }
    }
    return Q;
}
queue Q=新队列();
布尔值[]已访问=新布尔值[];
int num=9//元素数
int begin=0//开始点定义为“S”
int-end=2//定义为“E”的终点
专用队列BFS(int[][]adj,int begin){
访问[开始]=真;
排队(开始);
而(!Q.isEmpty()){
int元素=Q.dequeue();
int temp=元件;

而(temp您在第一次迭代中遇到了条件
temp==end
,因为您的temp从0开始,然后它是1,没有向队列插入元素(因为它不与0相邻),然后它是2,没有插入,在条件
temp==end
(两者都等于2)您返回的Q只包含
begin
,因为还没有插入任何内容。因此您只有一次外循环迭代和三次内循环迭代

我建议进行以下修改

queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private void BFS(int[][] adj, int begin) {
    visited[begin] = true;
    Q.enqueue(begin);
    while (!Q.isEmpty()) {
        int element = Q.dequeue();
        if (element == end) {
            return Q;
        }
        int temp = 0;
        while (temp < num) {
            if ((!visited[temp]) && (adj[element][temp] == 1)) {
                Q.enqueue(temp);
                visited[temp] = true;
            }
            temp++;
        }
    }
    return Q;
}
queue Q=新队列();
布尔值[]已访问=新布尔值[];
int num=9;//元素数
int begin=0;//开始点定义为'S'
int end=2;//定义为“E”的端点
私有void BFS(int[]adj,int begin){
访问[开始]=真;
排队(开始);
而(!Q.isEmpty()){
int元素=Q.dequeue();
如果(元素==结束){
返回Q;
}
内部温度=0;
while(温度
如果您想知道结束后的最短路径,而不是返回
Q
,最好定义
int visted[]=new int[num]
,使用
-1
表示未访问,并在内部循环中设置
visted[temp]=element
。完成后,可以在
visted[end]后面找到最短路径
已访问[已访问[结束]]
…直到您到达
开始
我正在使用您的代码@maggot092,它返回一个队列
[8]
@riista可能是。此队列只感知您计划访问的顶点,因此这意味着在返回语句算法计划访问的点8处。如果要获取路径,请注意tucuxi注释。
queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private void BFS(int[][] adj, int begin) {
    visited[begin] = true;
    Q.enqueue(begin);
    while (!Q.isEmpty()) {
        int element = Q.dequeue();
        if (element == end) {
            return Q;
        }
        int temp = 0;
        while (temp < num) {
            if ((!visited[temp]) && (adj[element][temp] == 1)) {
                Q.enqueue(temp);
                visited[temp] = true;
            }
            temp++;
        }
    }
    return Q;
}