按图找最近的路 [华为]【BFS】

题目描述:

有一张m*n的地图,地图描述了起点和终点的位置,也描述了两点间分布的高山湖泊,高山湖泊挡住去路,需要绕道行走,请问从起点到终点的最短路径有几条,距离是多少?
注意:走动路线只能上下左右,不能斜着走。

输入描述:

假设是55的地图,那么四个角的坐标表示为(0,0),(0,4),(4,4),(4,0);
起点是(0,1),终点是(3,3)
高山湖泊的个数:1
高山湖泊的位置(2,2)
输入表示:
5 5 -----图的大小是5
5
0 1 -----起点坐标
3 3 -----终点坐标
1 -----湖泊个数
2 2 -----湖泊坐标
注意:坐标的单位长度为1。
输出:
最短路径有4条,距离是5;输出格式:4 5
样例1

输入:5 5
0 1
3 3
1
2 2
输出:4 5

样例2

输入:5 5
1 0
3 3
2
2 2
2 1
输出:2 5

思路:

正常BFS。为了避免出现环死循环,在判断条件中增加,当将要更新的距离大于当前点的距离时就不再加入队列。

AC代码

#include 
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;

int n,m,x;
int sx, sy, tx, ty;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1};
int g[N][N], dist[N][N];
int res = 0x3f3f3f3f;
map<int,int> p;

void bfs()
{
    queue<PII> q;
    q.push({sx, sy});
    dist[sx][sy] = 0;
    while(!q.empty())
    {
        auto t = q.front();
        q.pop();
        for(int i = 0; i < 4; i ++)
        {
            int x = t.first + dx[i], y = t.second + dy[i];
            int tmp = dist[t.first][t.second] + 1;
            if(x < 0 || x >= n || y < 0 || y >= m || g[x][y] == 1 || dist[x][y] < tmp) continue;
            dist[x][y] = min(dist[x][y], tmp);
            if(x == tx && y == ty)
            {
                p[tmp] ++;
                break;
            }
            q.push({x, y});
        }
    }
}


int main()
{
    cin>>n>>m>>sx>>sy>>tx>>ty>>x;
    while(x --)
    {
        int a, b;
        cin>>a>>b;
        g[a][b] = 1;
    }
    memset(dist, 0x3f, sizeof dist);
    bfs();
    cout<<p[dist[tx][ty]]<<" "<<dist[tx][ty]<<endl;
    return 0;
}

你可能感兴趣的:(算法题解,数据结构,知识图谱,百度)