标签:
题意:给出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