一个广搜题,就多了一个p点的处理,我们在以起点为开始广搜 遇见第一个p时(这个p一定是理起点最近的点)再将多有的p点都爆搜出来,压入队列,然后正常广搜就ok啦!!
5000*10000貌似没有超int啊!!wa了一次,改成longlong过了,测试数据有问题???
#include<iostream> #include<cstdio> #include<queue> using namespace std; char a[5005][5005]; long long map[5005][5005]; int r,c,t,sx,sy,ex,ey,sum,sign; int dir[4][2]={1,0,0,1,-1,0,0,-1}; void bfs(int x,int y){ queue<int> q; q.push(x); q.push(y); while(!q.empty()){ int m=q.front();q.pop(); int n=q.front();q.pop(); for(int i=0;i<4;i++){ int mm=m+dir[i][1]; int nn=n+dir[i][0]; if(mm>=0&&mm<r&&nn>=0&&nn<c&&a[mm][nn]!='#'&&map[mm][nn]==0){ if(a[mm][nn]!='P'){ if(a[mm][nn]=='*'){ map[mm][nn]=map[m][n]+t; q.push(mm); q.push(nn); } if(a[mm][nn]=='C'){ sign=1;//标记是否找到终点 map[mm][nn]=map[m][n]; return ; } } else if(a[mm][nn]=='P'){ for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(i==mm&&j==nn) continue; if(a[i][j]=='P'){//搜索所有p点,加入队列, a[i][j]='!';//防止第二次又搜到p点 q.push(i); q.push(j); map[i][j]=map[m][n]; } } } } } } } } int main(){ while(~scanf("%d%d%d",&r,&c,&t)){ for(int i=0;i<r;i++) scanf("%s",a[i]); for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ map[i][j]=0; if(a[i][j]=='Y'){ sx=i;sy=j; } if(a[i][j]=='C'){ ex=i;ey=j; } } } sign=0; sum=0; bfs(sx,sy); if(sign==0) printf("Damn teoy!\n"); else cout<<map[ex][ey]<<endl; } }