标签:
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1250 Accepted Submission(s): 407
#include<bits/stdc++.h> using namespace std; const int maxn=110; struct WaterDrops{ //水坑 int x,y; WaterDrops(){} WaterDrops(int xx,int yy){ x=xx,y=yy; } }waterdrops[maxn]; struct Drops{ //水滴 int x,y; int dir,t; Drops(){} Drops(int xx,int yy,int d,int tt){ x=xx,y=yy,dir=d,t=tt; } }drops[maxn*5]; int crack[maxn][maxn],Map[maxn][maxn];//记录迸射、水坑容量 int f[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int r,c,T; queue<Drops>Q; bool inside(int x,int y){ //判断是否在边界中 if(x>=1&&x<=r&&y>=1&&y<=c){ return true; }else{ return false; } } void BFS(){ int xx, yy, tt, d,tx,ty; Drops st; while(!Q.empty()){ st=Q.front(); xx=st.x,yy=st.y,d=st.dir,tt=st.t; Q.pop(); if(Map[xx][yy]){ //如果该位置还有水坑 Map[xx][yy]++; if(Map[xx][yy]>4){ Map[xx][yy]=0; //容量置0 crack[xx][yy]=tt;//记录迸射时间 for(int i=0;i<4;i++){ tx=xx+f[i][0],ty=yy+f[i][1]; if(inside(tx,ty)){ if(tt+1<=T){ Q.push(Drops(tx,ty,i,tt+1)); } } } } }else if(crack[xx][yy]!=tt){//如果没有水坑或水坑迸射,且当前小水滴不是跟发生迸射的那个小水滴同时到达 tx=xx+f[d][0]; ty=yy+f[d][1]; if(inside(tx,ty)){ if(tt+1<=T){ Q.push(Drops(tx,ty,d,tt+1)); } } } } } void init(){ while(!Q.empty()) Q.pop(); memset(Map,0,sizeof(Map)); memset(crack,0,sizeof(crack)); } int main(){ int n,xx,yy,val,tx,ty; while(scanf("%d%d%d%d",&r,&c,&n,&T)!=EOF){ init(); for(int i=1;i<=n;i++){ scanf("%d%d%d",&xx,&yy,&val); waterdrops[i].x=xx,waterdrops[i].y=yy; Map[xx][yy]=val; } scanf("%d%d",&xx,&yy); crack[xx][yy]=1; for(int i=0;i<4;i++){ tx=xx+f[i][0]; ty=yy+f[i][1]; if(inside(tx,ty)){ Q.push(Drops(tx,ty,i,1)); } } BFS(); for(int i=1;i<=n;i++){ tx=waterdrops[i].x,ty=waterdrops[i].y; if(Map[tx][ty]==0){ printf("0 %d\n",crack[tx][ty]); }else{ printf("1 %d\n",Map[tx][ty]); } } } return 0; }
HDU 5336——XYZ and Drops——————【广搜BFS】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4700784.html