HUST第八届程序设计竞赛-G小乐乐打游戏(双bfs)

题目描述

小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
        最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
        吃猪游戏很简单,给定一个地图,大小为n*m,在地图中会随机出现一个火山口,只要小乐乐能逃离这个地图,他便能吃猪! 
        但吃鸡远没有那么简单:
        1.小乐乐每走一次只能上下左右四个方向中走一步。
        2.小乐乐每走一步,火山喷发的岩浆就会向四周蔓延一个格子,所有岩浆走过的地方都视为被岩浆覆盖。
        3.小乐乐碰到岩浆就会死。
        4.地图中还有很多障碍,使得小乐乐不能到达,但是岩浆却可以把障碍融化。
        5.小乐乐只有走到题目给定的终点才算游戏胜利,才能吃猪。
        小乐乐哪见过这场面,当场就蒙了,就想请帮帮他,告诉他是否能吃猪。

输入描述:

多组样例输入

第一行给定n,m,(1 <= n, m <= 1000)代表地图的大小。

接下来n行,每一行m个字符,代表地图,对于每一个字符,如果是‘.‘,代表是平地,‘S‘代表小乐乐起始的位置,‘E‘代表终点,‘#‘代表障碍物,‘F‘代表火山口。

输出描述:

输出只有一行。如果小乐乐能吃猪,输出"PIG PIG PIG!"。否则输出"A! WO SI LA!"。

输入

3 3
F..
#S#
#.E

输出

PIG PIG PIG!

思路:主要是注意火山如何处理,这个题用dfs显然很麻烦,因为要处理火山岩浆,岩浆每走一步扩散四边(四周),所以用bfs更好处理。岩浆先走,这样人就不能走岩浆走过的地方。岩浆走过的地方标记成2,便于岩浆广搜。处理的时候,要一步处理一步的,不能直接塞到队列里循环。所以要记一下下一步要处理多少位置(新队列元素)。坑点:1.四周是上下左右,而不是八个方向。2.输入的时候注意,一行行输入即可。

 1 //注意火山先走,这样便于判断会不会被烫死
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6
 7 struct node{
 8     int x,y;
 9 };
10
11 char map[1005][1005];
12 int mark[1005][1005];
13 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
14 int n,m,xf,yf,xs,ys,xe,ye;
15 int flag;
16
17 void bfs(){
18     queue<node>q;
19     queue<node>p;
20     node head1,next1,head2,next2;
21     head1.x=xs,head1.y=ys;
22     q.push(head1);
23     head2.x=xf,head2.y=yf;
24     p.push(head2);
25     int num1=1,num2=1;
26
27     while(!q.empty()&&!p.empty()){
28
29         int t2=0;
30         while(num2--){//岩浆
31             head2=p.front();
32             p.pop();
33             for(int i=0;i<4;i++){
34                 int xx=head2.x+dir[i][0];
35                 int yy=head2.y+dir[i][1];
36                 if(xx<0||yy<0||xx>=n||yy>=m||mark[xx][yy]==2)continue;
37                 mark[xx][yy]=2;
38                 t2++;
39                 next2.x=xx,next2.y=yy;
40                 p.push(next2);
41             }
42         }
43         num2=t2;
44
45
46         int t1=0;
47         while(num1--){//人
48             head1=q.front();
49             q.pop();
50             for(int i=0;i<4;i++){
51                 int xx=head1.x+dir[i][0];
52                 int yy=head1.y+dir[i][1];
53                 if(xx==xe&&yy==ye&&mark[xx][yy]==0){
54                     flag=1;
55                     return ;
56                 }
57                 if(xx<0||yy<0||xx>=n||yy>=m||mark[xx][yy]||map[xx][yy]==‘#‘) continue;
58                 t1++;
59                 mark[xx][yy]=1;
60                 next1.x=xx,next1.y=yy;
61                 q.push(next1);
62             }
63         }
64            num1=t1;
65     }
66 }
67
68 int main(){
69     while(~scanf("%d%d",&n,&m)){
70
71     for(int i=0;i<n;i++){
72         scanf("%s",map[i]);
73         for(int j=0;j<m;j++){
74             if(map[i][j]==‘F‘) xf=i,yf=j;
75             if(map[i][j]==‘S‘) xs=i,ys=j;
76             if(map[i][j]==‘E‘) xe=i,ye=j;
77         }
78     }
79     memset(mark,0,sizeof(mark));
80     mark[xf][yf]=2;
81     mark[xs][ys]=1;
82     flag=0;
83     bfs();
84
85     if(flag) printf("PIG PIG PIG!\n");
86     else printf("A! WO SI LA!\n");
87
88     }
89     return 0;
90 } 

原文地址:https://www.cnblogs.com/yzhhh/p/10050864.html

时间: 2024-08-02 02:35:24

HUST第八届程序设计竞赛-G小乐乐打游戏(双bfs)的相关文章

小乐乐打游戏

题目描述 小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏.         最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩.         吃猪游戏很简单,给定一个地图,大小为n*m,在地图中会随机出现一个火山口,只要小乐乐能逃离这个地图,他便能吃猪!          但吃鸡远没有那么简单:         1.小乐乐每走一次只能上下左右四个方向中走一步.         2.小乐乐每走一步,火山喷发的岩浆就会向四周蔓延一个格子,所有岩浆走过的地方都视为被岩浆覆盖.  

南邮第八届程序设计竞赛之网络预选赛

抱着试一试的态度参加学校的竞赛,自己还是太水,只会做签到题,虽然进入现场赛了,但还是有点担心啊,吗一下总结总结; [+] 1.帅神妹纸的生日礼物 2.玛德之杖 3.小明的排队 4.Money 5.简单的序列 6.有趣的区间异或值 7.Single or Single 8.有套路的BoJie 9.Dreaming 10.小明表达式 11.拯救活动室的男女比例 12.文科生or理科生 帅神妹纸的生日礼物 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536

南邮第八届程序设计竞赛之网络预选赛小结 一(错题集)

帅神妹纸的生日礼物 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 比赛描述 A协大牛帅神的妹纸最近又要过生日了,然而妹纸心里早已有一个想要的礼物,妹纸想要的礼物就是10种稀有的钻石,帅神为了满足妹纸的要求,四处打探知道了钻石在一个神秘的地方,这个地方有很多神,所有神灵站成一排,每个神手上有一种钻石,然而懒虫帅神为了少走路,想着尽可能少的访问相邻神,从他们手中获得钻石,已知妹纸对于每种钻石需求的数量多少,求问帅神需要最少访问多少连续的神

南邮第八届程序设计竞赛之网络预选赛总结

把内容吗一下,方便总结: 目录(?)[-] 帅神妹纸的生日礼物 玛德之杖 小明的排队 Money 简单的序列 有趣的区间异或值 Single or Single 有套路的BoJie Dreaming 小明表达式 拯救活动室的男女比例 文科生or理科生

2018年长沙理工大学第十三届程序设计竞赛 E 小木乃伊到我家

题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力.qwb想把这么可爱的小木乃伊送给AA,于是便找上了快递姐姐,这下可让快递姐姐犯愁了,因为去往AA家的路实在太难走了(甚至有可能没有路能走到AA家),快递姐姐找上聪明的ACMer,想请你帮忙找出最快到达AA家的路,你行吗? 输入描述: 第一行输入两个整数n和m(2<=n<=m<=200000),分别表示有n座城市和m条路,城市编号为1~n(快递姐姐所在城市为1,AA所在城市为n).接下

ACM-南京理工大学第八届程序设计竞赛-网络赛(2016.04.17)

A.偷吃糖果Time Limit: 1000Ms Memory Limit: 65536KB Description小鱼喜欢吃糖果.他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成.其中'a'到'z'表示具体的某种糖果类别.他原本打算送给他喜欢的女生,但是要送给女孩子的话两盒糖果不能有差别(即字符串s和t完全相同).所以,他决定偷吃几块,他吃糖果的策略是每次选出一盒糖果中两个连续的同种类别的糖果,然后吃掉其中一块.该策略可以使用多次.例如一盒糖果是'rrrjj',他可以把这盒糖

湖南省第十二届大学生计算机程序设计竞赛 G Parenthesis

1809: Parenthesis Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-th question is whether P remains balanced after pai and pbi  swapped. Note that questions are individual so that they have no affect

第八届福建省大学生程序设计竞赛-重现赛

第八届福建省大学生程序设计竞赛-重现赛 B   计算几何 题意:问两个三角形是相交.包含还是相离. tags:套板子..求出相交的面积,再判断一下 /* 多边形相交面积模板 */ #define maxn 510 const double eps=1E-8; int sig(double d){ return(d>eps)-(d<-eps); } struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} b

第八届山东省ACM大学生程序设计竞赛个人总结

因为省赛,从开学紧张到5月7号.心思也几乎全放在ACM的训练上.因为我还是校台球协会的会长,所以台协还有一些事情需要忙,但是我都给延迟了.老会长一直在催我办校赛,但我一直说 等等吧,因为校赛只能在周六或周日举办,而我们的ACM组队集训也都在周六周日, 如果我去支持校赛的话,那么一整天的集训就浪费了.不止这样,前期的准备工作也挺耗时的.就这样,我到现在都还没举办校赛(打算定在5月14号,不过那天我得去清华参加一个ACM邀请赛,所以还是主持不了,得让副会长去主持了,因为这个比赛不能再推了,再下个周又