hdu4527小明系列故事——玩转十滴水 (BFS+DFS)

2024-05-12 21:32

本文主要是介绍hdu4527小明系列故事——玩转十滴水 (BFS+DFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem Description
小明最近喜欢上了一个名为十滴水的游戏。


  游戏是在一个6*6的方格内进行的,每个格子上有一滴水或者没有水滴。水滴分为四个等级1~4。初始时你有十滴水,通过把水加入格子内的水滴,会让水滴升1级。你也可以把水放到空格子内,这样会在这个格子里面产生一个1级的水滴。当水滴等级大于4时则会爆裂为四个小水滴,并向四个方向飞溅。每个飞溅的小水滴碰到其他水滴后会融入其中,使其升一级或者爆裂,以此类推。飞溅的小水滴互不干扰,运动速度相等(1秒可以移动一个格子的距离)。水滴爆裂后就消失掉了。

Input
题目包含多组测试用例;
对于每组数据,首先是6行,每行有6个整数数字,每个数字的范围为0~4;当数字为0时,表示空格子,当数字为1~4时,表示1~4级的水滴;
然后第七行是一个整数m,表示有m个操作;接下来是m行,每行有两个整数x, y ,表示在(x,y)放入一滴水。
特别说明:每次都是在全部的水滴静止后才进行下一次操作,也就是说只有在方格内没有任何飞溅的小水滴时才能放入一滴水。

[Technical Specification]
1 <= m <= 10
1 <= x, y <= 6

Output
对于每组测试数据,请输出m个操作之后6*6方格内水滴的样子,每组数据的输出后面跟着一个空行。

Sample Input
  
0 0 0 4 0 4 0 0 0 0 0 0 1 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 6 0 0 0 4 0 4 0 2 0 4 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 6 2 2 0 2 0 3 3 3 0 1 3 1 2 2 2 4 0 4 2 4 4 2 2 3 3 3 2 4 0 1 1 3 4 3 0 1 6 5 3 5 3 3 3 3 2 2 1 6 3

Sample Output
  
0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 00 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 4 0 2 0 3 0 0 0 4 3 2 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 4 4 0 0 0 0 3
Hint
第一组数据: (1,6)爆裂,然后在第二秒(1,4)(2,6)爆裂,在第四秒,两滴水同时到达(3,4), (3,4)变成了6,爆裂,然后在第七秒(3,1)(6,4)变成了2。
 思路:加一滴水后能暴裂就加入队列或着是暴裂后的每一步走向位置为0时也加入队列。
注意点:每一步都要控制一样的时间。
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
typedef struct nn
{int x,y,dire;
}node;
queue<node> Q[2];//用2个队列是为了控制好一个队列里面是同一时间走一步
int map[8][8],vist[8][8];
int k,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//k表示第k个队列void bfs()
{int e,tx,ty;node q,p;while(!Q[k].empty())//队列放的位置在map中的数字只有0或大于4{q=Q[k].front(); Q[k].pop();vist[q.y][q.x]=0;if(map[q.y][q.x]>4)//当可以暴破时{map[q.y][q.x]=0;//把当前点变为0for(e=0;e<4;e++)//向4个方向走一步{tx=q.x+dir[e][0]; ty=q.y+dir[e][1];if(tx>0&&ty>0&&tx<=6&&ty<=6){p.x=tx; p.y=ty; p.dire=e;  //记录方向和位置if(map[ty][tx]==0)  //当等于0时,直接放入下一个队列中Q[k*-1+1].push(p);else if(map[ty][tx]+1<=4)  //当走向这个点时有值,但不能暴,加个1,不放入队列map[ty][tx]+=1;else       //当可以暴破时{map[ty][tx]+=1;if(vist[ty][tx]==0)  //这里一定要控制,不能一个队列放两个相同的位置{vist[ty][tx]=1;Q[k*-1+1].push(p); //放入下一个队列中}}}}}else //当前点为0时,下面的步骤和上面的相同{tx=q.x+dir[q.dire][0];ty=q.y+dir[q.dire][1];if(tx>0&&ty>0&&tx<=6&&ty<=6){p.x=tx;p.y=ty;p.dire=q.dire;if(map[ty][tx]==0)Q[k*-1+1].push(p);else if(map[ty][tx]+1<5){map[ty][tx]+=1;}else{map[ty][tx]+=1;if(vist[ty][tx]==0){vist[ty][tx]=1;Q[k*-1+1].push(p);}}}}}k=k*-1+1;//下一个队列if(!Q[k].empty())bfs();
}
int main()
{int x,y,m;node q;while(scanf("%d",&map[1][1])>0){for(y=1;y<=6;y++)for(x=1;x<=6;x++)if(y!=1||x!=1)scanf("%d",&map[y][x]);scanf("%d",&m);k=0;while(!Q[k].empty())Q[k].pop();while(!Q[k*-1+1].empty())Q[k*-1+1].pop();while(m--){scanf("%d%d",&y,&x);map[y][x]+=1;if(map[y][x]>4){memset(vist,0,sizeof(vist));q.y=y;q.x=x; vist[y][x]=1;Q[k].push(q);bfs();}}for(y=1;y<=6;y++){printf("%d",map[y][1]);for(x=2;x<=6;x++)printf(" %d",map[y][x]);printf("\n");}printf("\n");}
}


这篇关于hdu4527小明系列故事——玩转十滴水 (BFS+DFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983791

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One