题目链接:

一、读题

题意:蒜头君要回家,但是他没有钥匙,他需要在图中先找到钥匙,然后再拿着钥匙回家,问蒜头君回到家的最短路。

二、建模

(一)n*m的网格

由网格我们可以想到搜索算法

(二)最短路

要求最短路,DFS和BFS都可以,但是按照复杂度来看,DFS会超时,所以选用BFS

三、编码

代码分三个部分:BFS、输入、调用BFS

(一)BFS

int n, m, ans=2e9,cnt=0;
int vis[maxn][maxn];
char map[maxn][maxn];
int sx,sy,tx,ty;
int d1[maxn][maxn];
int d2[maxn][maxn];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
struct node {
    int x, y, step;
};
int bfs1(int x, int y) {
    queue < node > que;
    node q, p;
    q.x = x, q.y = y, q.step = 0;
    vis[x][y] = 1;
    que.push(q);
    while (!que.empty()) {
        p = que.front();
        que.pop();
        if (cnt>=n*m) {
            return p.step;
        }
        for (int i = 0; i < 4; i++) {
            q.x = p.x + dir[i][0];
            q.y = p.y + dir[i][1];
            q.step = p.step + 1;
            if (q.x >= 1 && q.x <= n && q.y >= 1 && q.y <= m && !vis[q.x][q.y] && map[q.x][q.y]!='#') {
                vis[q.x][q.y] = 1;
                que.push(q);
                d1[q.x][q.y]=q.step;
                cnt++;
            }
        }
    }
    return -1; //没有合法路径
}
int bfs2(int x, int y) {
    queue < node > que;
    node q, p;
    q.x = x, q.y = y, q.step = 0;
    vis[x][y] = 1;
    que.push(q);
    while (!que.empty()) {
        p = que.front();
        que.pop();
        if (cnt>=n*m) {
            return p.step;
        }
        for (int i = 0; i < 4; i++) {
            q.x = p.x + dir[i][0];
            q.y = p.y + dir[i][1];
            q.step = p.step + 1;
            if (q.x >= 1 && q.x <= n && q.y >= 1 && q.y <= m && !vis[q.x][q.y] && map[q.x][q.y]!='#') {
                vis[q.x][q.y] = 1;
                que.push(q);
                d2[q.x][q.y]=q.step;
                cnt++;
            }
        }
    }
    return -1; //没有合法路径
}

BFS基础代码,只是把结束条件改成了遍历全图

(二)输入

cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>map[i][j];
            if(map[i][j]=='S'){
                sx=i;
                sy=j;
            }
            if(map[i][j]=='T'){
                tx=i;
                ty=j;
            }
        }

(三)调用BFS

bfs1(sx,sy);
    cnt=0;
    memset(vis,0,sizeof(vis));
    bfs2(tx,ty);

(EXTRA)调试代码

    for(int i=1;i<=n;i++,cout<<endl)
        for(int j=1;j<=m;j++)
            cout<<d1[i][j]<<"\t";
    cout<<endl;
    for(int i=1;i<=n;i++,cout<<endl)
        for(int j=1;j<=m;j++)
            cout<<d2[i][j]<<"\t";

 

感谢支持!