NOJ 1042 电子老鼠闯迷宫

来源:互联网 发布:淘宝身份认证失败 编辑:程序博客网 时间:2024/05/20 07:17

2016.11.3

【题目描述】
1042.电子老鼠闯迷宫

时限:1000ms 内存限制:10000K 总时限:3000ms

描述
有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少要几步从起点走到终点。

输入
本题包含一个测例。在测例的第一行有四个由空格分隔的整数,分别表示起点的坐标S(x.y)和终点的坐标T(x,y)。从第二行开始的12行中,每行有12个字符,描述迷宫的情况,其中’X’表示建筑物,’.’表示路.
输出
输出一个整数,即电子老鼠走出迷宫至少需要的步数。

输入样例
2 9 11 8
XXXXXXXXXXXX
X……X.XXX
X.X.XX…..X
X.X.XX.XXX.X
X.X…..X..X
X.XXXXXXXXXX
X…X.X….X
X.XXX…XXXX
X…..X….X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX
输出样例
28

【解题思路】
最短路问题,BFS

【代码实现】

# include <iostream># include <queue>using namespace std;int sx, sy, tx, ty;int num = 0;char mapp[20][20];int dx[5] = {0, 0, 0, 1, -1};int dy[5] = {0, 1, -1, 0, 0};struct zb{    int x, y;    int s;}start, end;queue<zb>q;int bfs(void);int main(void){    //freopen("sample.txt", "r", stdin);    int i, j;    cin >> sx >> sy >> tx >> ty;    for (i = 1; i <= 12; ++i)        for (j = 1; j <= 12; ++j)            cin >> mapp[i][j];    start.x = sx;    start.y = sy;    end.x = tx;    end.y = ty;    start.s = 0;    mapp[start.x][start.y] = 'X';    q.push(start);    num = bfs();    cout << num << endl;    return 0;}int bfs(void){    int i;    zb t, k;    while (!q.empty())    {        t = q.front();        q.pop();        for (i = 1; i <= 4; ++i)        {            k.x = t.x + dx[i];            k.y = t.y + dy[i];            if (k.x == end.x && k.y == end.y)                return t.s + 1;            if (mapp[k.x][k.y] == '.')            {                k.s = t.s + 1;                q.push(k);                mapp[k.x][k.y] = 'X';            }        }    }}

【心得体会】
对于点坐标的BFS扩展,可以定义结构体

0 0
原创粉丝点击