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
映射下方迷宫的邻接(侧面是元素#):
S X E | 0 1 2
O O O | 3 4 5
O X O | 6 7 8
我正在使用邻接矩阵来遍历迷宫中的元素。这是一个遍历矩阵的广度优先搜索算法。
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;
}
执行BFS()
会返回size()
1
的队列。具体来说,队列只包含begin
(在本例中为0
)。该算法应生成[0, 3, 4, 5, 2]
的队列。在第一个System.out.println("blah")
开头后立即插入while()
表明它只迭代一次。
为什么我的算法过早停止?如何调整它以获得我想要的输出?我的目标是设置一个算法,在这种情况下找到“0”和“2”之间可能的最短路径。
答案 0 :(得分:2)
你在第一次迭代时遇到条件temp == end
因为你的temp从0开始,然后它是1而没有插入元素到队列(因为它不与0相邻),那么它是2而没有插入,而你在这里在条件temp == end
(均等于2)下,如果尚未插入任何内容,则返回仅包含begin
的Q.所以你只有一次外循环迭代和三次内循环迭代。
我建议进行以下修改
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;
}