BNU 49102 进化之地(Evoland)【Bfs】
来源:互联网 发布:手机淘宝怎么快速升心 编辑:程序博客网 时间:2024/04/29 21:22
进化之地(Evoland)
最近xhyu和hwq欢乐地通了一款RPG(Role-playing game)神作——《进化之地》,这是一部用RPG讲述RPG发展史的RPG。随着剧情发展,游戏从最原始的2D黑白像素块无音乐模式,逐渐变为32位色图,有了音效,开启打怪、对话、升级模式,纹理映射,连NPC都是开宝箱开出来的,带着玩家从20年前的FC时代走到如今的3D动作游戏中。
其中一个名为“神圣森林”的迷宫设计十分巧妙,玩家需要不停地在2D画面和3D画面之间切换来通过。
如下图:
很明显左边是2D模式,右边是3D 模式。
2D模式下,小树苗(左边红圈)可以通过,而高台(上方红圈)不能通过;
3D模式下,小树苗(中间红圈)不能通过,而高台(下方红圈)可以通过;
两个模式中,都有一个蓝色的东西,那是时空之石,通过击打它可以在2D模式与3D模式间转换。
经过半个小时努力终于通过这里以后,聪慧的hwq表示要用ACM的眼光严肃看待这个问题,于是随手画了几个图,让xhyu速速的找到每个图的解法,找不到没人权。
为了尽快恢复人权,xhyu只好向聪慧的你求助。
注意:为了避免误会说明一下,上面两幅图不是同一个小场景的截图,正常情况下,当击打时空之石时,场景中所有物品的相对位置不变,只是2D效果和3D效果改变了。
Input
输入的第一行是一个整数t,表示数据组数。(t<=30)
对每组数据:第一行三个整数n,m,分别为地图的行数、列数。(1<n,m<=100)
接下来有n行字符串,每行m个字符,各个字符含义:
0 起点(每图只有一个,初始为2D)
1 终点(每图只有一个,结束时可以是2D可以是3D)
. 通路(2D/3D均可通过)
# 障碍物(2D/3D均不可通过)
@ 时空之石(2D/3D均可通过)
2 小树苗(2D可通过,3D不可通过)
3 高台(3D可通过,2D不可通过)
保证每个图的时空之石数量不超过12,保证输入合法。
注意:
1.初始为2D状态,到达终点时可以2D也可以3D;
2.经过时空之石时可以选择切换2D/3D也可以不切换;
3.必须走到时空之石那一格才能切换2D/3D,时空之石可以正常通过;
4.切换2D/3D是在原地进行,不算做一步;
5.中途允许经过起点,时空之石可以多次使用,障碍物无论2D/3D都不能通过。
Output
每组数据输出一个整数,表示从起点走到终点最少需要多少步,如果不能走到终点,则输出-1。
Sample Input
31 6#@0.311 72@303.17 5.####.1..####3#.@#.#.##.#....#0####
Sample Output
5-116
Hint
各字符宽度不一样不方便查看,建议把样例写下来观察。
(1)先向左走到@转换为3D,再向右走到终点;
(2)初始是2D,左右都走不通,无解输出-1;
(3)先去触发时空之石,再去终点;
Source
Author
思路:
Bfs相关问题肯定是要考虑每个点能够走的状态。
设定vis【i】【j】【2】表示走到位子(i,j)是3D画面还是2D画面即可。
那么对应将每种情况都讨论好,就没有别的什么了。
Ac代码:
#include<stdio.h>#include<string.h>#include<queue>using namespace std;struct node{ int x,y,step,tmp;}now,nex;char a[200][200];int vis[200][200][4];int fx[4]={0,0,1,-1};int fy[4]={1,-1,0,0};int n,m;void Bfs(int sx,int sy){ memset(vis,0,sizeof(vis)); now.x=sx; now.y=sy; now.step=0; now.tmp=2; vis[now.x][now.y][now.tmp]=1; queue<node>s; s.push(now); while(!s.empty()) { now=s.front(); if(a[now.x][now.y]=='1') { printf("%d\n",now.step); return ; } s.pop(); for(int i=0;i<4;i++) { nex.x=now.x+fx[i]; nex.y=now.y+fy[i]; nex.step=now.step+1; if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m) { if(a[nex.x][nex.y]=='.'||a[nex.x][nex.y]=='0'||a[nex.x][nex.y]=='1') { nex.tmp=now.tmp; if(vis[nex.x][nex.y][nex.tmp]==0) { vis[nex.x][nex.y][nex.tmp]=1; s.push(nex); } } if(a[nex.x][nex.y]=='#')continue; if(a[nex.x][nex.y]=='@') { nex.tmp=now.tmp; if(vis[nex.x][nex.y][nex.tmp]==0) { vis[nex.x][nex.y][nex.tmp]=1; s.push(nex); } nex.tmp=5-now.tmp; if(vis[nex.x][nex.y][nex.tmp]==0) { vis[nex.x][nex.y][nex.tmp]=1; s.push(nex); } } if(a[nex.x][nex.y]=='2') { if(now.tmp==2) { nex.tmp=now.tmp; if(vis[nex.x][nex.y][nex.tmp]==0) { vis[nex.x][nex.y][nex.tmp]=1; s.push(nex); } } else continue; } if(a[nex.x][nex.y]=='3') { if(now.tmp==3) { nex.tmp=now.tmp; if(vis[nex.x][nex.y][nex.tmp]==0) { vis[nex.x][nex.y][nex.tmp]=1; s.push(nex); } } else continue; } } } } printf("-1\n"); return ;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); int sx,sy; sx=-1;sy=-1; for(int i=0;i<n;i++) { scanf("%s",a[i]); for(int j=0;j<m;j++) { if(a[i][j]=='0') { sx=i,sy=j; } } } if(sx==-1)printf("-1\n"); else Bfs(sx,sy); }}
- BNU 49102进化之地(Evoland) BFS
- BNU 49102 进化之地(Evoland)【Bfs】
- BNU 49102
- BNU 沙漠之旅
- BNU 沙漠之旅
- BNU 26582 Gregory the Grasshopper【简单BFS】
- BNU 25588 Elevator Trouble【裸BFS】
- bnu 4289 Theta Puzzle[bfs, 打表]
- BNU
- [进化算法] 进化算法之标准进化规划(EP)
- 社会进化之解析
- 程序员进化之路
- 进化之路
- lambda表达式之进化
- HDU 4166 & BNU 32715 Robot Navigation (记忆化bfs)
- bnu 14327 The Water Bowls[bfs,状态压缩]
- bnu 51641 Certain Maze(bfs)(北师16校赛)
- BNU 1642 简单的图论问题? 最短路+BFS
- java并发编程实践之对象的共享
- com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize out of START_ARRAY token
- <<Linux内核设计与实现>>读书笔记(六)-内核数据结构
- mybatis <forEach>标签的使用
- 关于多线程的几点总结(博客园迁移)
- BNU 49102 进化之地(Evoland)【Bfs】
- HelloWorld
- js哪些情况会出现隐式类型转换
- Linux命令eval用法
- 【基于SSH框架的个人博客系统02】项目分析与数据库表设计
- 基于信号实现的用户态线程库
- c程序shell脚本获取返回值的方法
- caffe使用lenet5识别手写数字
- 图形上下,左右对称旋转代码