题目
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
输入格式
第一行输入两个非零整数 M和 N,两者均不大于 20。M表示迷阵行数,N表示迷阵列数。接下来有M行, 每行包含 N个字符,不同字符分别代表不同含义:1) ‘@’:少年李逍遥所在的位置;2) ‘.’:可以安全通行的方格;3) ‘#’:有怪物的方格;4) ‘*’:仙药所在位置。
输出格式
输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 −1。
Sample Input
8 8
.@##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.…
.#…###
Sample Output
10
Sample Input 2
6 5
..#.
.#…
…##.
…
.#…
…@
Sample Output 2
8
Sample Input 3
9 6
.#…#.
.#..#
.####.
…#…
…#…
…#…
…#…
#.@.##
.#…#.
Sample Output 3
-1
题意分析:
一个岛,有初始位置”@“,有终点位置“”,’.‘表示能走,’#'表示不呢个走。
解题思路:
广搜,注意找到仙草位置坐标后要把仙草变成能走的路。
AC 代码
#include<iostream>
#include<cstring>
using namespace std;
struct no
{
int x;
int y;
int s;
}qu[50000];
char mp[30][30];
int book[30][30];
int main()
{
int n,m,bx,by,tx,ty;
while(cin>>m>>n)
{
memset(book,0,sizeof(book));
memset(mp,'\0',sizeof(mp));
//memset(qu,0,sizeof(qu));
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
{
cin>>mp[i][j];
if(mp[i][j]=='@')
bx=i,by=j;
if(mp[i][j]=='*')
{
tx=i,ty=j;
mp[i][j]='.';
}
}
int h,t;
h=1,t=1;
qu[t].x=bx;
qu[t].y=by;
qu[t].s=0;
book[bx][by]=1;
t++;
int flag=0;
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
while(h<t)
{
for(int k=0; k<4; k++)
{
int xx=qu[h].x+next[k][0];
int yy=qu[h].y+next[k][1];
if(xx<1||xx>m||yy<1||yy>n) continue;
if(mp[xx][yy]=='#') continue;
if(mp[xx][yy]=='.'&&book[xx][yy]==0)
{
book[xx][yy]=1;
qu[t].x=xx;
qu[t].y=yy;
qu[t].s=qu[h].s+1;
t++;
}
if(xx==tx&&yy==ty){
flag=1;
break;
}
}
if(flag==1)
break;
h++;
}
if(flag==1)
cout<<qu[t-1].s<<endl;
else
cout<<"-1"<<endl;
}
}