解题报告 之 HDU5336 XYZ and Drops

解题报告 之 HDU5336 XYZ and Drops

Description

XYZ is playing an interesting game called "drops". It is played on a  grid.
Each grid cell is either empty, or occupied by a waterdrop. Each waterdrop has a property "size". The waterdrop cracks when its size is larger than 4, and produces 4 small drops moving towards 4 different directions (up, down, left and right).

In every second, every small drop moves to the next cell of its direction. It is possible that multiple small drops can be at same cell, and they won‘t collide. Then for each cell occupied by a waterdrop, the waterdrop‘s size increases by the number of the
small drops in this cell, and these small drops disappears.

You are given a game and a position (),
before the first second there is a waterdrop cracking at position ().
XYZ wants to know each waterdrop‘s status after  seconds,
can you help him?

Input

The first line contains four integers  and  stands
for the numbers of waterdrops at the beginning.

Each line of the following  lines
contains three integers ,
meaning that the -th
waterdrop is at position ()
and its size is .
()

The next line contains two integers .

It is guaranteed that all the positions in the input are distinct.

Multiple test cases (about 100 cases), please read until EOF (End Of File).

Output

 lines.
Each line contains two integers :

If the -th
waterdrop cracks in  seconds,  the
time when it cracked.

If the -th
waterdrop doesn‘t crack in  seconds,  its
size after  seconds.

Sample Input

4 4 5 10
2 1 4
2 3 3
2 4 4
3 1 2
4 3 4
4 4 

Sample Output

0 5
0 3
0 2
1 3
0 1 

题目大意:有一个n*m的网格,有k个水洼,给出k个水洼的坐标和水量([1,4])。一个水洼水量超过四就立即会向上下左右各发射一个水滴并立即消失,水滴每秒移动一个格子,遇到新的水洼就加入进去,出了边缘就消失。现在在0s时有一个水洼在(x,y)爆裂,问
T 秒后原来那些水洼的信息(爆裂/未爆裂等等)。

分析:一道毫无节操的模拟题,直接模拟每个水滴和水洼就可以了。。。本来还想着优化一下把爆裂的水洼去掉,后来发现太麻烦了就直接上了,结果还是A掉了。每过一秒更新每个水滴和水洼的状态,注意先水滴后水洼,因为水洼可能爆裂产生水滴那么下一秒这些水滴就要移动了。有一个巧妙的点是,判断一个水洼是不是已经消失了用二维数组Size来判断而不是去扫描一遍。

上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;
const int MAXN = 100 + 10;

struct wp
{
	int x, y;
	int state;
	int t;
	wp()
	{

	}
	wp( int x, int y, int state, int t )
	{
		this->x = x;
		this->y = y;
		this->state = state;
		this->t = t;
	}
};

struct drop
{
	int x, y;
	int dir;
	int state;
	drop()
	{ }
	drop( int x, int y, int dir,int state )
	{
		this->x = x;
		this->y = y;
		this->dir = dir;
		this->state = state;
	}
};

int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
wp p[MAXN];
drop d[MAXN * 10];
int Size[MAXN][MAXN];
int n, m, k, t;

bool inline check( int x, int y )
{
	return 1 <= x&&x <= n && 1 <= y&&y <= m;
}

int main()
{
	while(scanf( "%d%d%d%d", &n, &m, &k, &t ) == 4)
	{
		int x, y, s;
		memset( Size, 0, sizeof Size );
		for(int i = 0; i < k; i++)
		{
			scanf( "%d%d%d", &x, &y, &s );
			Size[x][y] = s;
			p[i] = wp( x, y, 1, -1 );
		}

		scanf( "%d%d", &x, &y );
		int cnt = 0;
		for(int i = 0; i < 4; i++)
		{
			d[cnt++] = drop( x, y, i, 1 );
		}

		for(int tt = 1; tt <= t; tt++)
		{
			for(int i = 0; i < cnt; i++)
			{
				if(d[i].state == 0) continue;
				d[i].x += dir[d[i].dir][0];
				d[i].y += dir[d[i].dir][1];
				if(!check( d[i].x, d[i].y ))
				{
					d[i].state = 0;
				}

				if(Size[d[i].x][d[i].y]>0)
				{
					Size[d[i].x][d[i].y]++;
					d[i].state = 0;
				}
			}

			for(int i = 0; i < k; i++)
			{
				if(p[i].state == 0)continue;
				if(Size[p[i].x][p[i].y]>4)
				{
					p[i].state = 0;
					p[i].t = tt;
					Size[p[i].x][p[i].y] = 0;
					for(int j = 0; j < 4; j++)
					{
						d[cnt++] = drop( p[i].x, p[i].y, j, 1 );
					}
				}
			}
		}

		for(int i = 0; i < k; i++)
		{
			printf( "%d %d\n", p[i].state, (p[i].state == 0 ? p[i].t : Size[p[i].x][p[i].y]) );
		}
	}
	return 0;
}

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

时间: 2024-11-06 01:56:06

解题报告 之 HDU5336 XYZ and Drops的相关文章

hdu5336 XYZ and Drops (模拟+vector删除第i个元素)

题目链接: hdu5336 XYZ and Drops 模拟题一道,比较水,但是因为题意曲折 顺带vector的删除操作也是不太明白 总之逗了很长时间 删除第i个元素 v.erase(v.begin() + i); 删完后后面的元素都会往前移一个,所以下一个元素还是v[i] 也可以下面这样 it = v.erase(it); //erase()返回值是指向下一个元素的指针 //#define __LOCAL //#define __LLD #include <stdio.h> #include

洛谷OJ P1032 字串变换 解题报告

洛谷OJ P1032 字串变换 解题报告 by MedalPluS   [题目描述] 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:

Hdu 5336 XYZ and Drops (bfs 模拟)

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

NOIP2009解题报告

09年的题总体来说 没有难题,但是每道题除了第一题都要认真的慢慢写才能AC, 第一题: R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:1. S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他字母).2. S国对于每个字母规定了对应的“密字”.加密的过程就是将原信息中的所有字母替换为其对应的“密字”.3. 每个字母只对应一个唯一的“密字

HDU 5336 XYZ and Drops (模拟+搜索,详解)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5336 题面: XYZ and Drops Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 725    Accepted Submission(s): 201 Problem Description XYZ is playing an in

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共