哈理工第六届程序设计大赛 G 逃脱(BFS)
2016-11-20 21:11
197 查看
思路:一开始我预处理了每个格子被火燃烧的最短时间然后BFS,WA到不能自理,后来没预处理直接都扔进队列里就A了。。。
Submit: 231 Solved: 15
[Submit][Status][Web
Board]
幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素:
“.”:表示这是一块空地,是可以随意穿梭的。
“#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁。
“S”:表示mengxiang000和Tabris所在位子。
“E”:表示幼儿园的出口。
“*”表示火灾发源地(保证输入只有一个火灾发源地)。
已知每秒有火的地方都会向周围八个格子(上下左右、左上、右上、左下、右下)蔓延火势.mengxiang000和Tabris每秒都可以选择周围四个格子(上下左右)进行移动。(假设两人这一秒行动完之后,火势才蔓延开)
根据已知条件,判断两人能否成功逃脱险境,如果可以,输出最短逃离时间,否则输出T_T。
第二行输入两个整数n,m,表示幼儿园的大小。
接下来n行,每行m个字符,表示此格子是什么元素。
t<=200
3<=n<=30
3<=M<=30
保证图中有一个起点,一个出口,一个火灾源处.
#include<bits/stdc++.h> using namespace std; const int maxn = 35; struct Node { int x,y,w; int flag; Node() { w=0; } }; int n,m; int vis[maxn][maxn],fir[maxn][maxn]; int dir[8][2]={{1,0},{-1,0},{0,-1},{0,1},{1,-1},{-1,-1},{-1,1},{1,1}}; char mp[maxn][maxn]; bool check(Node tt) { if(tt.x<0||tt.x>=n||tt.y<0||tt.y>=m)return true; return false; } int bfs(Node p,Node f) { queue<Node>q; memset(vis,0,sizeof(vis)); memset(fir,0,sizeof(fir)); f.flag=1; fir[f.x][f.y]=1; vis[p.x][p.y]=1; q.push(p); q.push(f); while(!q.empty()) { Node t = q.front(); q.pop(); if(t.flag) { for(int i = 0;i<8;i++) { Node tt = t; tt.x+=dir[i][0]; tt.y+=dir[i][1]; if(check(tt) ||fir[tt.x][tt.y])continue; q.push(tt); fir[tt.x][tt.y]=1; } } else { if(mp[t.x][t.y]=='E')return t.w; if(fir[t.x][t.y])continue; for(int i = 0;i<4;i++) { Node tmp = t; tmp.x+=dir[i][0]; tmp.y+=dir[i][1]; if(check(tmp)||fir[tmp.x][tmp.y])continue; if(fir[tmp.x][tmp.y] || vis[tmp.x][tmp.y] || mp[tmp.x][tmp.y]=='#')continue; tmp.w++; q.push(tmp); vis[tmp.x][tmp.y]=1; } } } return -1; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); Node peo,fir; peo.flag=0; fir.flag=1; for(int i = 0;i<n;i++) { scanf("%s",mp[i]); for(int j = 0;j<m;j++) { if(mp[i][j]=='*') { fir.x=i; fir.y=j; } if(mp[i][j]=='S') { peo.x=i; peo.y=j; } } } int ans = bfs(peo,fir); if(ans==-1)printf("T_T\n"); else printf("%d\n",ans); } }
Problem G: 逃脱
Time Limit: 1 Sec Memory Limit: 32 MBSubmit: 231 Solved: 15
[Submit][Status][Web
Board]
Description
这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的mengxiang000和Tabris听到了火灾警报声的同时拔腿就跑,不知道两人是否能够逃脱险境?幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素:
“.”:表示这是一块空地,是可以随意穿梭的。
“#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁。
“S”:表示mengxiang000和Tabris所在位子。
“E”:表示幼儿园的出口。
“*”表示火灾发源地(保证输入只有一个火灾发源地)。
已知每秒有火的地方都会向周围八个格子(上下左右、左上、右上、左下、右下)蔓延火势.mengxiang000和Tabris每秒都可以选择周围四个格子(上下左右)进行移动。(假设两人这一秒行动完之后,火势才蔓延开)
根据已知条件,判断两人能否成功逃脱险境,如果可以,输出最短逃离时间,否则输出T_T。
Input
第一行输入一个整数t,表示一共的测试数据组数。第二行输入两个整数n,m,表示幼儿园的大小。
接下来n行,每行m个字符,表示此格子是什么元素。
t<=200
3<=n<=30
3<=M<=30
保证图中有一个起点,一个出口,一个火灾源处.
Output
每组数据输出一行,如果两人能够成功到达出口,那么输出最短逃离时间,否则输出T_TSample Input
35 5*...........S#....E......5 5...#*..#S#...##....E.....5 5.....S......*#....E......
Sample Output
2T_TT_T
HINT
为了防止孩子们嬉戏中受伤,墙体是橡胶制作的,可以燃烧的哦。相关文章推荐
- 哈理工第六届程序设计大赛 I 旅行 (最短路)
- 哈理工第六届程序设计大赛 D 经商 (并查集+背包)
- 哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 Problem G:逃脱 By Assassin
- 哈理工第六届程序设计大赛 F 苦逼的单身狗(滑窗)
- 湖南省第六届程序设计大赛D(台球碰撞)
- 湖南省第六届 中信软件教育杯 大学生程序设计大赛试题 第一题 汽水瓶
- 湖南省第六届程序设计大赛D(台球碰撞)
- 哈理工 第五届程序设计大赛——B.沼跃鱼
- nyoj 711最舒适的路线(第六届河南省程序设计大赛 并查集)
- nyoj711&&zznu1624 最舒适的路线(第六届河南省程序设计大赛 广搜)
- 南京林业大学“未来之星”第六届程序设计大赛(决赛)试题G 参考代码
- 第六届河南省程序设计大赛
- nyoj714 Card Trick(第六届河南省程序设计大赛)
- 安工第六届程序设计大赛(复赛)
- NYOJ - 716 - River Crossing --第六届河南省程序设计大赛 (简单DP!!)
- 河南省第六届程序设计大赛--Card Trick
- NYOJ - 715 - Adjacent Bit Counts --第六届河南省程序设计大赛 (DP!!)
- 哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛(离官方最近的题解)
- NYOJ-712 探寻宝藏(第六届河南省程序设计大赛)
- 河南省第六届程序设计大赛——异形卵