传送门
![]()
![]()
![]()
![]()
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,m,x,y,qx,qy;//终点坐标(qx,qy)
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p[10001][4]; //定义队列:行、列、个数
bool b[101][101];
void bfs()
{
int t=0,w=1; //队列头t,队列尾w
while(t<w)
{
t++;
for(int i=0;i<4;i++)
{
x=p[t][1]+dx[i];
y=p[t][2]+dy[i];
if(x>0&&x<=m&&y>0&&y<=n&&b[x][y])
{
w++;
p[w][1]=x;
p[w][2]=y;
p[w][3]=p[t][3]+1;
b[x][y]=false;
if(x==qx&&y==qy) //目标
{
printf("%d\n",p[w][3]);
return; //输出答案,结束当此扩展
}
}
}
}
printf("-1\n");
}
int main()
{ char k; // 字符方式输入地图
while(cin>>m>>n)
{
if(m==0&&n==0) return 0; //输入0 0结束
memset(p,0,sizeof(p));//调用多组数据时候 清0备用
memset(b,true,sizeof(b));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>k;
if(k=='#') b[i][j]=false; //障碍
else b[i][j]=true;
if(k=='@') //遇到起点,就入队,并设为假
{
p[1][1]=i;
p[1][2]=j;
p[1][3]=0;
b[i][j]=false;
}
if(k=='*') // 如果是终点,则记录下来
{
qx=i;
qy=j;
}
}
}
bfs();
}
}