BNU - 49102
进化之地(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
3
1 6
#@0.31 1 7
2@303.1 7 5
.####
.1..#
###3#
.@#.#
.##.#
....#
0####
Sample Output
5
-1
16
Hint
各字符宽度不一样不方便查看,建议把样例写下来观察。
(1)先向左走到@转换为3D,再向右走到终点;
(2)初始是2D,左右都走不通,无解输出-1;
(3)先去触发时空之石,再去终点;
#include <iostream>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <vector>
#define maxn 110
using namespace std;
char ch[maxn][maxn];
int dx[] = {,,-,};
int dy[] = {,-,,};
int n,m;
int vis[][][];
struct Node
{
int x;
int y;
int step;
int dime;
} start,end;
int check(Node a) ///二维
{
if(a.x >= && a.x <n && a.y >= && a.y <m ) return ;
return ;
}
int bfs()
{
Node now,tmp,temp;
queue<Node>que;
vis[start.x][start.y][] = ;
while(!que.empty()) que.pop();
que.push(start);
while(!que.empty())
{
tmp = que.front();
que.pop();
for(int i=; i<; i++)
{
now.x = tmp.x + dx[i];
now.y = tmp.y + dy[i];
now.step = tmp.step + ;
if(ch[now.x][now.y] == '')
{
return now.step;
}
if(check(now))
{
if(ch[now.x][now.y] == '.' )
{
now.dime= tmp.dime ;
if(!vis[now.x] [now.y][now.dime])
{
que.push(now);
vis[now.x] [now.y][now.dime] = ;
} }
else if(ch[now.x][now.y] == '')
{
if(tmp.dime == )
{
now.dime = ;
if(!vis[now.x] [now.y][now.dime])
{
que.push(now);
vis[now.x] [now.y][now.dime] = ;
}
}
}
else if(ch[now.x][now.y] == '')
{
if(tmp.dime == )
{
now.dime = ;
if(!vis[now.x] [now.y][now.dime])
{
que.push(now);
vis[now.x] [now.y][now.dime] = ;
}
}
}
else if(ch[now.x][now.y] == '@')
{
now.dime = ;
if(!vis[now.x] [now.y][now.dime])
{
que.push(now);
vis[now.x] [now.y][now.dime] = ;
}
now.dime = ;
if(!vis[now.x] [now.y][now.dime])
{
que.push(now);
vis[now.x] [now.y][now.dime] = ;
}
}
}
}
}
return ;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,,sizeof(vis));
memset(ch,'\0',sizeof(ch));
scanf("%d %d",&n,&m);
for(int i=; i<n; i++)
{
scanf("%s",ch[i]);
for(int j=; j<m; j++)
{
if(ch[i][j] == '')
{
start.x = i;
start.y = j;
ch[i][j] = '.';
start.step = ;
start.dime = ;
}
if(ch[i][j] == '')
{
end.x = i;
end.y = j;
}
}
}
int res = -;
res = bfs();
if(res) printf("%d\n",res);
else printf("-1\n");
}
return ;
}
BNU - 49102的更多相关文章
- BNU 2418 Ultra-QuickSort (线段树求逆序对)
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...
- BNU OJ 33691 / LA 4817 Calculator JAVA大数
留着当个模板用,在BNU上AC,在LA上RE……可能是java的提交方式不同??? 数和运算符各开一个栈. 表达式从左到右扫一遍,将数存成大数,遇到数压在 数的栈,运算符压在 运算符的栈,每当遇到右括 ...
- bnu 34982 Beautiful Garden(暴力)
题目链接:bnu 34982 Beautiful Garden 题目大意:给定一个长度为n的序列,问说最少移动多少点,使得序列成等差序列,点的位置能够为小数. 解题思路:算是纯暴力吧.枚举等差的起始和 ...
- bnu 34986 Football on Table(数学+暴力)
pid=34986" target="_blank" style="">题目连接:bnu 34986 Football on Table 题目大 ...
- BNU 4096 逆序 思维题
https://www.bnuoj.com/v3/problem_show.php?pid=4096 对于一个序列a,我们定义它的逆序数为满足a[i]>a[j]且i<j的有序对<i, ...
- BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...
- bnu A Matrix 北京邀请赛A题
A Matrix Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class n ...
- BNU 4188 Superprime Rib【BFS】
题意:给出n,输出n位超级质数,超级质数的定义为“依次去掉右边一位后仍然为质数的数” 因为一个n位质数去掉右边一位数之后仍然为质数,说明它是由n-1位超级质数演变而来的, 同理,n-1位超级质数也由n ...
- BNU 51276 - 道路修建 Small (并查集)
题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=51276 具体题意不描述了,一眼看过去就是并查集,关键是添加边以后更新答案.我是开个二维的数组an ...
随机推荐
- HDU1007:Quoit Design——题解
http://acm.hdu.edu.cn/showproblem.php?pid=1007 题目大意:给n个点,求点对最短距离/2. —————————————————————— 平面分治裸题. 暂 ...
- [NOI2008] 道路设计
link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...
- HDU 4417 离线+树状数组
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- SpringMVC 用注解Annotation驱动的IoC功能@Autowired @Component
转载自:http://blog.csdn.net/lufeng20/article/details/7598564 本文分为三个部分:概述.使用注解进行属性注入.使用注解进行Bean的自动定义. 一, ...
- Item 4 ----通过私有构造器强化不可实例化的能力
场景: 在创建工具类的时候,大部分是无需实例化的,实例化对它们没有意义.在这种情况下,创建的类,要确保它是不可以实例化的. 存在问题: 在创建不可实例化的类时,虽然没有定义构造器.但是,客户端在使 ...
- 「6月雅礼集训 2017 Day8」gcd
[题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...
- 【BZOJ】2190 [SDOI2008]仪仗队
[算法]欧拉函数 欧拉线性筛 [题解]将图从左至右,从下至上,分别标号0~n-1. 除了坐标0,一个点会被观察到当且仅当其坐标(i,j)的i与j互质,否则会被(i/d,j/d)挡住. 所以累加2~n- ...
- 多线程---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) 多线程 技术博客http://www.cnblo ...
- Katu Puzzle(POJ3678+2-SAT问题+tarjan缩点)
题目链接:http://poj.org/problem?id=3678 题目: 题意:给你a,b,c,op,op为逻辑运算符或.与.异或,使得a op b = c,让你判断这些运算符是否存在矛盾,不存 ...
- vue router mode 设置"hash"与"history"的区别
router官网的说明如下: ********************************************我是官网说明分隔符--开始**************************** ...