图森未来一道笔试题-迷宫难题【BFS找S->E的最短步数】

时间限制:3秒

空间限制:262144K

图森未来的自动驾驶小卡车今天被派到了一个陌生的迷宫内部运输一些货物。

工程师小图已经提前拿到了这个迷宫的地图,地图是一个n*m的字符矩阵,上面包含四种不同的字符:".","#","S"和"E"。其中"S"和"E"分别代表运货的起点和终点,"."为可行驶区域,"#"为不可行驶区域。每个可行驶区域都可以移动到上、下、左、右相邻的可行驶区域,且四种移动的距离都为1。

为了估算运输的成本,小图希望你可以帮助他计算从起点到终点的最短行驶距离。

例如,对于下方的输入样例1,从起点到终点有且仅有一条路径,路径的长度为15(最开始卡车在S的位置,需要经过15次移动才能到达E的位置)。所以,最短行驶距离也为15。

而输入样例2,因为多出了一条直接从S到E的路径,所以最短行驶距离会减少到7。

输入描述:
第一行有两个正整数,分别为n和m(2 <= n, m <= 1000),为数据的行数和列数。

接下来的n行,每行包含m个字符,构成了整张地图。地图中只包含".","#","S"和"E"四种字符,且"S"和"E"都会且仅会出现一次。

输出描述:
输出一个正整数,为从起点到终点最短行驶距离的长度。

输入例子1:
6 10
##########
#........#
#.######.#
#.######.#
#.######.#
#S######E#

输出例子1:
15

输入例子2:
6 10
##########
#........#
#.######.#
#.######.#
#.######.#
#S......E#

输出例子2:
7

寻找从S->E的最短步数,二维字符地图。

#include <stdio.h>
#include <algorithm>
#include <stack>
#include <cstring>
#include <queue>

using namespace std;
int n, m;
char g[1001][1001];

struct node
{
    int x,y;
}S, E;

bool ok(int x, int y) //判断是否出了边界
{
    if(x>=0 && x<n && y>=0 && y<m) return true;
    else return false;
}

int dir[4][2]={
    {-1,0}, {1,0}, {0,-1}, {0,1} //定义 上下左右
};

int bfs_sp()
{
    queue<node>q;
    int path[1001][1001]; memset(path, 0, sizeof(path));
    bool vis[1001][1001]; memset(vis, false, sizeof(vis)); //标记节点是否走过
    q.push(S);//将起点入队列
    vis[S.x][S.y]=true;//标记访问
    path[S.x][S.y]++;
    node cur;
    while(!q.empty())
    {
        cur=q.front(); q.pop();//取出队首元素
        //printf("%d--%d ", cur.x, cur.y);
        for(int i=0; i<4; i++){
            int x=cur.x+dir[i][0];
            int y=cur.y+dir[i][1];
            if(ok(x, y) && (g[x][y]=='.'||g[x][y]=='E') && vis[x][y]==false )
            {   node cc; cc.x=x; cc.y=y;
                q.push(cc); path[x][y]=path[cur.x][cur.y]+1;
                vis[x][y]=true;
                if(g[x][y]=='E')
                    { return path[x][y];}
            }
        }
    }
}

int main()
{
    scanf("%d %d%*c", &n, &m);
    int i, j;
    for(i=0; i<n; i++){
        scanf("%s", g[i]);
        for(j=0; j<m; j++){
            if(g[i][j]=='S'){
                S.x=i; S.y=j;
            } //找到起点
            else if(g[i][j]=='E') {
                E.x=i; E.y=j;
            } //找到终点
        }
    } //建图完毕
    int ans = bfs_sp();
    printf("%d\n", ans-1);
    return 0;
}

  

 
posted @ 2019-11-26 17:03  我喜欢旅行  阅读(513)  评论(0编辑  收藏  举报