这个题应该要从Y M搜向@ 反向的话会超时(BFS)
下面我将俩个代码都贴上来
从@搜向Y M 会超时
超时代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,step;
};
int n,m,x[40005],y[40005],vis[205][205],flag1,flag2,flag;
char a[205][205];
int _x[]={1,-1,0,0};
int _y[]={0,0,1,-1};
void bfs(int o,int p)
{
node w,e;
w.x=o;
w.y=p;
w.step=0;
memset(vis,0,sizeof(vis));
vis[w.x][w.y]=1;
queue<node>q;
q.push(w);
while(!q.empty())
{
w=q.front();
q.pop();
//cout<<w.x<<" "<<w.y<<" "<<w.step<<endl;
if(a[w.x][w.y]=='Y')
{
flag1=w.step;
}
if(a[w.x][w.y]=='M')
{
flag2=w.step;
}
if(flag1&&flag2)
{
flag=flag1+flag2;
return;
}
e.step=w.step+1;
for(int i=0;i<4;i++)
{
int xx=w.x+_x[i];
int yy=w.y+_y[i];
if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&vis[xx][yy]==0&&a[xx][yy]!='#')
{
vis[xx][yy]=1;
e.x=xx;
e.y=yy;
q.push(e);
}
}
}
}
int main()
{
while(cin>>n>>m)
{
int k=0,minn=0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='@')
{
x[k]=i;
y[k]=j;
k++;
}
}
for(int i=0;i<k;i++)
{
flag1=0;
flag2=0;
bfs(x[i],y[i]);
if(flag1+flag2==0)
continue;
if(flag<minn)
minn=flag;
}
cout<<minn*11<<endl;
}
}
从Y M搜向@
AC代码
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,step;
};
int n,m,k,vis[205][205],g[205][205][2];
char a[205][205];
int _x[]={1,-1,0,0};
int _y[]={0,0,1,-1};
void bfs(int x,int y,int k)
{
node w,e;
w.x=x;
w.y=y;
w.step=0;
vis[x][y]=1;
queue<node>q;
q.push(w);
while(!q.empty())
{
w=q.front();
q.pop();
if(a[w.x][w.y]=='@')
{
g[w.x][w.y][k]=w.step;//如果到达了@ 记录下来到达的时间(步数)
}
for(int i=0;i<4;i++)
{
int xx=w.x+_x[i];
int yy=w.y+_y[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&vis[xx][yy]==0&&a[xx][yy]!='#')
{
vis[xx][yy]=1;
e.x=xx;
e.y=yy;
e.step=w.step+1;
q.push(e);
}
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(g,0,sizeof(g));
int minn=0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
g[i][j][0]=g[i][j][1]=0x3f3f3f3f;//把g标为最大 防止y或者m到达不了某个@
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]=='Y')
{
k=0;
memset(vis,0,sizeof(vis));
bfs(i,j,k);
}
else if(a[i][j]=='M')
{
k=1;
memset(vis,0,sizeof(vis));
bfs(i,j,k);
}
}//从y m查询到 @
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]=='@')
{
int qqq=g[i][j][0]+g[i][j][1];
if(qqq<minn)
minn=qqq;
}
}
cout<<minn*11<<endl;
}
}