#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
class node
{
public:
int x,y,l;
node(int a=0,int b=0,int c=0):x(a),y(b),l(c){}
};
queue<node>Q;
int n,m;
int mp[3000][3000]={};
int vis[3000][3000]={};
char c;
int main()
{
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
scanf("%d %d",&n,&m);
memset(mp,-1,sizeof(mp));
memset(vis,-1,sizeof(vis));
for (register int i=1;i<=n;i++)
{
for (register int j=1;j<=m;j++)
{
c=getchar();
while (c=='\n'||c==' ')
{
c=getchar();
}
if (c=='.')
{
mp[i][j]=1;
vis[i][j]=-1;
}
if (c=='#')
{
mp[i][j]=0;
vis[i][j]=-1;
}
if (c=='d')
{
mp[i][j]=2;
vis[i][j]=-1;
}
if (c=='m')
{
Q.push(node(i,j,0));
mp[i][j]=1;
vis[i][j]=0;
}
}
}
while (!Q.empty())
{
node temp=Q.front();
Q.pop();
int i=temp.x,j=temp.y,k=temp.l;
if (mp[i][j]==2)
{
printf("%d",k);
return 0;
}
if (mp[i+1][j]>0&&vis[i+1][j]<0)
{
vis[i+1][j]=k+1;
Q.push(node(i+1,j,k+1));
}
if (mp[i-1][j]>0&&vis[i-1][j]<0)
{
vis[i-1][j]=k+1;
Q.push(node(i-1,j,k+1));
}
if (mp[i][j+1]>0&&vis[i][j+1]<0)
{
vis[i][j+1]=k+1;
Q.push(node(i,j+1,k+1));
}
if (mp[i][j-1]>0&&vis[i][j-1]<0)
{
vis[i][j-1]=k+1;
Q.push(node(i,j-1,k+1));
}
}
// for (register int i=1;i<=n;i++)
// {
// for (register int j=1;j<=m;j++)
// {
// printf("%d ",vis[i][j]);
// }
// putchar('\n');
// }
printf("No Way!\n");
return 0;
}
和题解对拍,答案都一样。
但是提交上去就是20分。。。
很多点都莫名其妙地 No Way 了。。。