搜索
第一次看到这道题以为很难就先放下了今天又来写
写了一发bfs超时了
先贴下代码、
#include
#include
#include
#include
#include
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;iq;
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
第一次思路是从一个点去找肯德基,然后再从肯德基找另一个人
当肯德基数量跟多的时候就会超时
这样走了无数次重复的路
正解是从两个点搜索两次
#include
#include
#include
#include
#include
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;iq;
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