简单的bfs搜索题,对每个初始的水滴依次扩展,当达到规定步数时跳出。这题还是有坑点的,对于每个初始的水滴,已经访问过的位置不再访问,但是对于不同的水滴,别的水滴已经访问过的,对于当前水滴来说可能还要访问,才能使扩展的范围最大。
#include<iostream> #include<string> #include<cstring> #include<queue> #include<algorithm> using namespace std; struct node { int a; int b; int step; }N[104]; int vis[2000][2000]; int x,y,t,l,w; int x1,x2,yy1,y2; int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; void bfs(int bx,int by,int mark) { node k; queue<node> q; k.a=bx,k.b=by,k.step=0; q.push(k); while(!q.empty()) { node temp=q.front(); q.pop(); if(temp.step>=t)//时间够了,跳出 return ; for(int i=0;i<4;i++) { node cur; int xx=temp.a+dir[i][0]; int yy=temp.b+dir[i][1]; if(xx>=1&&xx<=x&&yy>=1&yy<=y&&(vis[xx][yy]!=-1&&vis[xx][yy]!=mark)) { cur.a=xx,cur.b=yy; cur.step=temp.step+1; if(cur.step>=t) return ; else { q.push(cur); vis[xx][yy]=mark;//当前水源下不要走重复的 } } } } } int main() { while(cin>>x>>y>>t>>l>>w) { if(x==-1) break; memset(vis,0,sizeof(vis)); for(int i=1;i<=l;i++) cin>>N[i].a>>N[i].b; for(int i=1;i<=w;i++) { cin>>x1>>yy1>>x2>>y2; //将墙附为-1 if(x1==x2) { if(yy1>y2) swap(yy1,y2); for(int j=yy1;j<=y2;j++) { vis[x1][j]=-1; } } else if(yy1==y2) { if(x1>x2) swap(x1,x2); for(int j=x1;j<=x2;j++) vis[j][yy1]=-1; } else if(x1<x2) { if(yy1>y2) { for(int j=x1;j<=x2;j++) vis[j][yy1--]=-1; } else if(yy1<y2) { for(int j=x1;j<=x2;j++) vis[j][yy1++]=-1; } } else if(x1>x2) { if(yy1<y2) { for(int j=x2;j<=x1;j++) vis[j][y2--]=-1; } else if(yy1>y2) { for(int j=x2;j<=x1;j++) vis[j][y2++]=-1; } } } for(int i=1;i<=x;i++) { for(int j=1;j<=y;j++) cout<<vis[i][j]<<" "; cout<<endl; } for(int i=1;i<=l;i++) { vis[N[i].a][N[i].b]=1; bfs(N[i].a,N[i].b,i);//多个水滴 } int ans=0; for(int i=1;i<=x;i++) for(int j=1;j<=y;j++) { if(vis[i][j]>=1&&vis[i][j]<=l) ans++; } cout<<ans<<endl; } return 0; }