4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
66 88 66
搜索
第一次看到这道题以为很难就先放下了今天又来写
写了一发bfs超时了
先贴下代码、
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; int n,m,vis[201][201],d[4][2]={1,0,-1,0,0,1,0,-1}; char mm[201][201]; int vj(int x,int y){ if(x<0||x>=n||y<0||y>=m||vis[x][y])return 0; return 1; } struct node { int x,y,t; }k[40000],a,b; int main(){ while(cin>>n>>m){ for(int i=0;i<n;i++) scanf("%s",mm[i]); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(mm[i][j]=='Y'){ a.x=i; a.y=j; a.t=0; } } } memset(vis,0,sizeof(vis)); queue<node>q; q.push(a); int len=0; while(!q.empty()){ a=q.front(); q.pop(); if(mm[a.x][a.y]=='@'){ k[len++]=a; } for(int i=0;i<4;i++){ int xx=a.x+d[i][0]; int yy=a.y+d[i][1]; if(vj(xx,yy)&&mm[xx][yy]!='#'){ b.x=xx; b.y=yy; b.t=a.t+11; vis[xx][yy]=1; q.push(b); } } } int t[40001]; int h=0; for(int i=0;i<len;i++){ memset(vis,0,sizeof(vis)); q.push(k[i]); while(!q.empty()){ a=q.front(); q.pop(); if(mm[a.x][a.y]=='M'){ t[h++]=a.t; break; } for(int i=0;i<4;i++){ int xx=a.x+d[i][0]; int yy=a.y+d[i][1]; if(vj(xx,yy)&&mm[xx][yy]!='#'){ b.x=xx; b.y=yy; b.t=a.t+11; vis[xx][yy]=1; q.push(b); } } } } sort(t,t+h); cout<<t[0]<<endl; } return 0; }
第一次思路是从一个点去找肯德基,然后再从肯德基找另一个人
当肯德基数量跟多的时候就会超时
这样走了无数次重复的路
正解是从两个点搜索两次
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; int n,m,vis[201][201],t[200][200],d[4][2]={1,0,-1,0,0,1,0,-1}; char mm[201][201]; int vj(int x,int y){ if(x<0||x>=n||y<0||y>=m||vis[x][y])return 0; return 1; } struct node { int x,y,t; }k[40000],a,b,c; int main(){ while(cin>>n>>m){ for(int i=0;i<n;i++) scanf("%s",mm[i]); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ t[i][j]=99999999; if(mm[i][j]=='Y'){ a.x=i; a.y=j; a.t=0; } if(mm[i][j]=='M'){ c.x=i; c.y=j; c.t=0; } } } memset(vis,0,sizeof(vis)); queue<node>q; q.push(a); while(!q.empty()){ a=q.front(); q.pop(); if(mm[a.x][a.y]=='@'){ t[a.x][a.y]=a.t; } for(int i=0;i<4;i++){ int xx=a.x+d[i][0]; int yy=a.y+d[i][1]; if(vj(xx,yy)&&mm[xx][yy]!='#'){ b.x=xx; b.y=yy; b.t=a.t+11; vis[xx][yy]=1; q.push(b); } } } memset(vis,0,sizeof(vis)); q.push(c); while(!q.empty()){ a=q.front(); q.pop(); if(mm[a.x][a.y]=='@'){ t[a.x][a.y]+=a.t; } for(int i=0;i<4;i++){ int xx=a.x+d[i][0]; int yy=a.y+d[i][1]; if(vj(xx,yy)&&mm[xx][yy]!='#'){ b.x=xx; b.y=yy; b.t=a.t+11; vis[xx][yy]=1; q.push(b); } } } int minn=99999999; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(t[i][j]<minn)minn=t[i][j]; } } cout<<minn<<endl; } return 0; }