如何在矩阵上实现bfs?

时间:2014-03-25 18:10:13

标签: c++ shortest-path breadth-first-search

我在矩阵上实现bfs时遇到问题。看起来我的代码只检查起始节点的子节点。

我的目标是找到从'B'到'H'的最短路径。我还认为我的代码需要进行大量修改。先感谢您!

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

int bfs(int, int);

bool visited[100][100];
char matrica[100][100];

int m, n, d;

int main()
{

    scanf("%d %d", &m, &n);

    for(int i = 0;i < m;i++){
        for(int j = 0; j < n; j++){
            cin >> matrica[i][j];
            visited[i][j] = false;
        }
    }

    for(int i = 0;i < m;i++){
        for(int j = 0; j < n; j++){
            if(matrica[i][j] == 'B'){
                bfs(i, j);
            }
        }
    }

    cout << endl << d;

    return 0;
}

int gk[] = {1, 0, -1, 0};
int gr[] = {0, 1, 0, -1};

int bfs(int x, int y){

    cout << endl;

    queue<int>queue_x, queue_y;
    int topx, topy, d=0;

    //memset(visited, 0, sizeof visited);

    visited[x][y] = true;

    queue_x.push(x);
    queue_y.push(y);

    while(!queue_x.empty()){
        topx = queue_x.front();
        topy = queue_y.front();
        queue_x.pop();
        queue_y.pop();

        if(matrica[topx][topy] == 'H'){
            cout << endl << d << endl;
            d++;
            return d;
        }

        for(int i = 0; i < 4; i++){
            x += gk[i];
            y += gr[i];
            if(visited[x][y] == false && matrica[x][y] != '#'){
                visited[x][y] = true;
                matrica[x][y] = '*';
                queue_x.push(x);
                queue_y.push(y);
                d++;

                //-------------
                for(int i = 0; i < m;i++){
                    for(int j = 0; j < n;j++){
                        cout << matrica[i][j];
                    }
                    cout << endl;
                }
                //-------------
            }
        }
    }
}

输入/输出:

输入:

5
5
#####
#..B#
#...#
#...#
###H#

输出:

#####
#..B#
#...#
#...#
###H#
0

1 个答案:

答案 0 :(得分:2)

变量xy

x += gk[i];
y += gr[i];

不应该“记住”从一次迭代到下一次迭代的值。

将这些行更改为

x = topx + gk[i];
y = topy + gr[i];