标签:
题意:给出r*c的网格,有的网格为空,有的有水,再给出一个爆炸点,从这个点向四周爆出四个水滴,若碰到水则融为一体,若碰到其他水滴直接跑过去互不影响,每秒可跑一格,若水中水滴数量超过4则爆开,问T秒后网格的状态是怎样的。
做法:由于数据有点多,直接用set优化bfs一次走一步的过程,变成一次走多步即可。
#include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<climits> #include<list> #include<iomanip> #include<stack> #include<set> using namespace std; int num[110][110]; set<int>sr[110],sc[110]; int r,c,T; bool beyond(int tr,int tc) { return tr<1||tc<1||tr>r||tc>c; } struct point { int tr,tc,flag; point(){} point(int tr,int tc,int flag) { this->tr=tr; this->tc=tc; this->flag=flag; } }hehe[110]; vector<point>bx; bool vis[110][110]; void gao(int tr,int tc,int flag,int cnt) { if(!beyond(tr,tc)&&!vis[tr][tc]) { if(num[tr][tc]>0) { num[tr][tc]++; if(num[tr][tc]>4) { sr[tr].erase(tc); sc[tc].erase(tr); num[tr][tc]=-cnt; bx.push_back(point(tr,tc,0)); vis[tr][tc]=1; } } else bx.push_back(point(tr,tc,flag)); } } void work() { set<int>::iterator it; int cnt=0,p=0; while(1) { int len=bx.size(),mn=INT_MAX; if(p==len) return; for(int i=p;i<len;i++) { point t=bx[i]; int tr=t.tr,tc=t.tc,flag=t.flag; if(flag==0||flag==1) { it=sc[tc].lower_bound(tr); if(it!=sc[tc].begin()) { it--; mn=min(mn,tr-*it); } } if(flag==0||flag==2) { it=sc[tc].upper_bound(tr); if(it!=sc[tc].end()) mn=min(mn,*it-tr); } if(flag==0||flag==3) { it=sr[tr].lower_bound(tc); if(it!=sr[tr].begin()) { it--; mn=min(mn,tc-*it); } } if(flag==0||flag==4) { it=sr[tr].upper_bound(tc); if(it!=sr[tr].end()) mn=min(mn,*it-tc); } } if(cnt+mn>T) return; cnt+=mn; memset(vis,0,sizeof(vis)); for(int i=p;i<len;i++) { point t=bx[i]; int tr=t.tr,tc=t.tc,flag=t.flag; if(flag==0||flag==1) { tr-=mn; gao(tr,tc,1,cnt); tr+=mn; } if(flag==0||flag==2) { tr+=mn; gao(tr,tc,2,cnt); tr-=mn; } if(flag==0||flag==3) { tc-=mn; gao(tr,tc,3,cnt); tc+=mn; } if(flag==0||flag==4) { tc+=mn; gao(tr,tc,4,cnt); tc-=mn; } } p=len; } } int main() { int n; while(scanf("%d%d%d%d",&r,&c,&n,&T)!=EOF) { for(int i=1;i<=r;i++) sr[i].clear(); for(int i=1;i<=c;i++) sc[i].clear(); memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { int t; scanf("%d%d%d",&hehe[i].tr,&hehe[i].tc,&t); sr[hehe[i].tr].insert(hehe[i].tc); sc[hehe[i].tc].insert(hehe[i].tr); num[hehe[i].tr][hehe[i].tc]=t; } int tr,tc; scanf("%d%d",&tr,&tc); bx.clear(); bx.push_back(point(tr,tc,0)); work(); for(int i=0;i<n;i++) { tr=hehe[i].tr; tc=hehe[i].tc; int t=num[tr][tc]; if(t<0) printf("0 %d\n",-t); else printf("1 %d\n",t); } } }
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 414 Accepted Submission(s): 101
4 4 5 10 2 1 4 2 3 3 2 4 4 3 1 2 4 3 4 4 4
0 5 0 3 0 2 1 3 0 1
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stl112514/article/details/47156675