仙岛求药

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仙岛求药相关的知识,希望对你有一定的参考价值。

仙岛求药

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1251


时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

下图 显示了一个迷阵的样例及李逍遥找到仙药的路线。

技术分享

【输入】

输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:

1)‘@’:少年李逍遥所在的位置;

2)‘.’:可以安全通行的方格;

3)‘#’:有怪物的方格;

4)‘*’:仙药所在位置。

当在一行中读入的是两个零时,表示输入结束。

 

【输出】

对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。

【输入样例】

8 8
[email protected]##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
6 5
.*.#.
.#...
..##.
.....
.#...
[email protected]
9 6

.#..#.
.#.*.#
.####.
..#...
..#...
..#...
..#...
#[email protected]##
.#..#.
0 0

【输出样例】

10
8
-1
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int qx,qy,m,n;
const int zl[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char mp[25][25];
struct node{
    int x,y,step;
    node():x(),y(),step(){}
    node(const int x,const int y,const int step):x(x),y(y),step(step){}
};
void bfs()
{
    queue <node> Q;
    Q.push(node(qx,qy,0));
    mp[qx][qy]=#;
    while(!Q.empty())
    {
        node nw=Q.front();
        Q.pop();
        for(int i=0;i<4;i++)
        {
            int x1=nw.x+zl[i][0],yy1=nw.y+zl[i][1];
            if(x1>=0&&x1<m&&yy1>=0&&yy1<n&&(mp[x1][yy1]==*||mp[x1][yy1]==.))
            {
                if(mp[x1][yy1]==*)
                {
                    cout<<nw.step+1<<endl;
                    return ;
                }
                Q.push(node(x1,yy1,nw.step+1));
                mp[x1][yy1]=#;
            }
        }
        
    }
    cout<<"-1"<<endl;
}
int main()
{
    
    while(cin>>m>>n)
    {
        if(!m&&!n)break;
        for(int i=0;i<m;i++)
        {
            scanf("%s",mp[i]);
            for(int j=0;j<n;j++)
                if(mp[i][j]==@)
                {
                    qx=i;qy=j;
                }
        }
        bfs();
    }
}

 




以上是关于仙岛求药的主要内容,如果未能解决你的问题,请参考以下文章

AC日记——仙岛求药 openjude 2727

仙岛求药

2727:仙岛求药(广搜)

2727:仙岛求药

openjudge 2727:仙岛求药

仙岛求药