标签:搜索
题意:
有一个r 行 c 列的格子,给出n个格子里有水滴的大小。再给出时间限制T,使得水滴从(sx,sy)位置开始爆破,当飞渐的水遇到格子里的静态水时就会聚在一起,当聚集的水滴大小>4时就会爆破。问在T时给定的n个位置格子里的水滴情况,如果没有爆破就输出:1 格子里水滴大小。否则输出:0 爆破的时间。
分析 :见代码注释。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
const int maxn = 103;
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int r,c,n,t,si,sj;
struct Node
{
int x,y,dir,time;
}node[maxn];
int size[maxn][maxn],st[maxn][maxn];
void bfs(int x,int y)
{
int i;
Node cur,pre;
cur.x=x;cur.y=y;
cur.time=0;
cur.dir=-1; //表示要爆裂
queue<Node> q;
q.push(cur);
while(!q.empty())
{
pre=q.front();
q.pop();
if(pre.dir>=0) //如果不爆裂 按照原来的方向停止或者移动
{
int tx=pre.x+dx[pre.dir]; //按照原来的方向停止或者移动
int ty=pre.y+dy[pre.dir];
cur.x=tx;cur.y=ty;
cur.time=pre.time+1;
if(tx>=1 && tx<=r && ty>=1 && ty<=c && cur.time<=t)
{
if(size[tx][ty]) //如果有水珠挡住
{
size[tx][ty]++;
if(size[tx][ty]==5)
{
cur.dir=-1;
q.push(cur); //push放到里面,如果水滴是静止的就不用push了
}
}
else //如果遇到的是空格
{
cur.dir=pre.dir;
q.push(cur);
}
}
}
else //如果爆裂 按照爆裂的方向移动
{
st[pre.x][pre.y]=pre.time; //标记爆裂时间
size[pre.x][pre.y]=0; //放到这里是要处理如果同时有多个水滴流向该点,而该点早已经是4了的情况
for(i=0;i<4;i++)
{
int tx=pre.x+dx[i];
int ty=pre.y+dy[i];
cur.x=tx;cur.y=ty;
cur.time=pre.time+1;
if(tx>=1 && tx<=r && ty>=1 && ty<=c && cur.time<=t)
{
if(size[tx][ty]) //如果有水珠挡住
{
size[tx][ty]++;
if(size[tx][ty]==5)
{
cur.dir=-1;
q.push(cur); //push放到里面,如果水滴是静止的就不用push了
}
}
else //如果遇到的是空格
{
cur.dir=i;
q.push(cur);
}
}
}
}
}
}
int main()
{
// read;
while(~scanf("%d%d%d%d",&r,&c,&n,&t))
{
int i,j,sz;
memset(size,0,sizeof(size));
memset(st,0,sizeof(st));
for(i=0;i<n;i++)
{
scanf("%d%d%d",&node[i].x,&node[i].y,&sz);
size[node[i].x][node[i].y]=sz;
}
scanf("%d%d",&si,&sj);
bfs(si,sj);
for(i=0;i<n;i++)
{
int tx=node[i].x,ty=node[i].y;
if(size[tx][ty]==0)
cout<<"0 "<<st[tx][ty]<<endl;
else cout<<"1 "<<size[tx][ty]<<endl;
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:搜索
原文地址:http://blog.csdn.net/u010582475/article/details/47763007