HDU 5336(2015多校4)-XYZ and Drops(bfs)

题目地址:HDU 5336

题意:有一个r 行 c 列的格子,给出n个格子里有水滴的大小。再给出时间限制T,使得水滴从(sx,sy)位置开始爆破,当飞渐的水遇到格子里的静态水时就会聚在一起,当聚集的水滴大小>4时就会爆破。问在T时给定的n个位置格子里的水滴情况,如果没有爆破就输出:1 格子里水滴大小。否则输出:0 爆破的时间。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
int mp[110][110];
int time[110][110];
int jx[]= {0,1,0,-1};
int jy[]= {1,0,-1,0};
int r,c,n,T;
int sx,sy;
struct drop {
    int x,y;
    int time;
    int papa;
} f1,f2;
void bfs(int xx,int yy)
{
    queue<drop>q;
    f1.x=xx;
    f1.y=yy ;
    f1.time=0;
    f1.papa=-1;
    q.push(f1);
    while(!q.empty()){
     f1=q.front();
     q.pop();
     if(f1.papa>=0){
            f2.x=f1.x+jx[f1.papa];
            f2.y=f1.y+jy[f1.papa];
            f2.time=f1.time+1;
                if(f2.x>=1&&f2.x<=r&&f2.y>=1&&f2.y<=c&&f2.time<=T){
                    if(mp[f2.x][f2.y]){
                        mp[f2.x][f2.y]++;
                        if(mp[f2.x][f2.y]==5){
                            f2.papa=-1;
                            q.push(f2);
                        }
                    }
                    else{
                        f2.papa=f1.papa;
                        q.push(f2);
                    }
                }
        }
        else{
            time[f1.x][f1.y]=f1.time;
            mp[f1.x][f1.y]=0;
            for(int i=0; i<4; i++){
            f2.x=f1.x+jx[i];
            f2.y=f1.y+jy[i];
            f2.time=f1.time+1;
               if(f2.x>=1&&f2.x<=r&&f2.y>=1&&f2.y<=c&&f2.time<=T){
                    if(mp[f2.x][f2.y]){
                        mp[f2.x][f2.y]++;
                        if(mp[f2.x][f2.y]==5){
                            f2.papa=-1;
                            q.push(f2);
                        }
                    }
                    else{
                        f2.papa=i;
                        q.push(f2);
                    }
                }
            }
        }
    }
}
int main()
{
    int v;
    drop node[110];
    while(~scanf("%d %d %d %d",&r,&c,&n,&T))
    {
        memset(mp,0,sizeof(mp));
        for(int i=0;i<n;i++)
        {
            scanf("%d %d %d",&sx,&sy,&v);
            node[i].x=sx;
            node[i].y=sy;
            mp[sx][sy]+=v;
        }
        scanf("%d %d",&sx,&sy);
        bfs(sx,sy);
        for(int i=0;i<n;i++)
            if(mp[node[i].x][node[i].y])
                printf("1 %d\n",mp[node[i].x][node[i].y]);
            else
                printf("0 %d\n",time[node[i].x][node[i].y]);
    }
}
/*
同一时间到达同一个水滴(所以代码里是==5而不是>4)
4 4 5 100
1 1 4
1 2 3
1 3 4
1 4 4
2 3 4
2 4

1 4
1 4
0 2
0 1
0 1
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 19:17:42

HDU 5336(2015多校4)-XYZ and Drops(bfs)的相关文章

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

HDU 5347(2015多校5)-MZL&#39;s chemistry(打表)

题目地址HDU 5347 无脑流神题,自行脑补,百度大法好. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #

HDU 5344(2015多校5)-MZL&#39;s xor(水题)

题目地址:HDU 5344 题意:求所有(Ai+Aj)的异或值. 思路:可以发现(Ai+Aj)和(Aj+Ai)的异或值为0,所以最后只剩下(Ai+Ai). #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm>

HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列,该子序列分为三部分,第一部分与第三部分相同,第一部分与第二部分对称,如果存在求最长的符合这种条件的序列. 思路:用Manacher算法来处理回文串的长度,记录下以每一个-1(Manacher算法的插入)为中心的最大回文串的长度.然后从最大的开始穷举,只要p[i]-1即能得出以数字为中心的最大回文串的长度,然后找到右边对应的'-1',判断p[i]是不是大于所穷举的长度,如果当前的满足三段,那么就跳出,继续

HDU 5349(2015多校5)-MZL&#39;s simple problem(优先队列)

题目地址:HDU 5349 很水的优先队列就能搞好,只不过注意如果2操作结束后的队列为空,那么Max的值为-inf. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set&

Hdu 5336 XYZ and Drops (bfs 模拟)

题目链接: Hdu 5336 XYZ and Drops 题目描述: 有一个n*m的格子矩阵,在一些小格子里面可能会有一些水珠,每个小水珠都有一个size.现在呢,游戏开始咯,在一个指定的空的小格子里面有一个将要向四周爆裂的水珠,在下一面分别向上,下,左,右四个方向发射一个小水滴,(小水滴与水珠同,小水滴没有size),当小水滴走向一个格子,这个格子如果是空或者有其他的小水滴同时走到这个格子的情况下,对小水滴的运动轨迹是不影响的.但是遇到水珠的话,小水滴就会被吸收,水珠每次吸收一个小水滴size

HDU 5323(2015多校3)-Solve this interesting problem(dfs+剪枝)

题目地址:HDU 5323 题意:给一个l,r,表示区间[l,r],问是否存在区间为[0,n]的线段树的节点区间为[l,r],如果有求最小的n,如果没有输出-1. 思路:因为L/(R-L+1)<=2015,按照线段树的性质每次分区间序号扩大两倍,所以可以得出差不多有22层,所以用爆搜就可以,由上把[l,r]区间不断扩张,直到满足l==0为止.顺便剪剪枝. #include <stdio.h> #include <math.h> #include <string.h>

HDU 5387(2015多校8)-Clock(模拟)

题目地址:HDU 5387 题意:给你一个格式为hh:mm:ss的时间,问时针与分针.时针与秒针.分针与秒针之间夹角的度数是多少,若夹角度数不是整数,则输出A/B最简分数形式. 思路:每秒钟,分针走是0.1°,时针走(1/120)°:每分钟,时针走0.5°.所以对于时针的角度来说总共走动了h*30+m*0.5+s/120,对于分针的角度来说总共走掉了m*6+s*0.1,对于秒针来说,总共走动了s*6.因为乘法比较除法来说时间复杂度更精确一点,所以我们把走的角度*120,变成全部都是整数,最后再除

hdu 5361 2015多校联合训练赛#6 最短路

In Touch Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 67    Accepted Submission(s): 11 Problem Description There are n soda living in a straight line. soda are numbered by  from left to ri