邻接矩阵的广度优先算法:过早结束搜索,returns 大小为 1 的队列?
Breadth-first algorithm on adjacency matrix: premature ending of search, returns queue of size 1?
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()
returns size()
1
队列。具体来说,队列仅包含 begin
(在本例中为 0
)。该算法应生成 [0, 3, 4, 5, 2]
的队列。在第一个 while()
开头后立即插入 System.out.println("blah")
显示它只迭代一次。
为什么我的算法会提前停止?我怎样才能调整它以获得我想要的输出?我的目标是设计一种算法,在这种情况下找到“0”和“2”之间可能的最短路径。
你在第一次迭代时遇到了条件temp == end
,因为你的temp从0开始,然后它是1而不插入元素到队列(因为它不与0相邻),然后它是2而不插入,这里在条件 temp == end
(均等于 2)下,您是 return 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;
}
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()
returns size()
1
队列。具体来说,队列仅包含 begin
(在本例中为 0
)。该算法应生成 [0, 3, 4, 5, 2]
的队列。在第一个 while()
开头后立即插入 System.out.println("blah")
显示它只迭代一次。
为什么我的算法会提前停止?我怎样才能调整它以获得我想要的输出?我的目标是设计一种算法,在这种情况下找到“0”和“2”之间可能的最短路径。
你在第一次迭代时遇到了条件temp == end
,因为你的temp从0开始,然后它是1而不插入元素到队列(因为它不与0相邻),然后它是2而不插入,这里在条件 temp == end
(均等于 2)下,您是 return 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;
}