CDOJ_149 解救小Q
原题网址:http://acm.uestc.edu.cn/#/problem/show/149
小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。 迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫 里还有一些古老的传送
阵,一旦走到传送阵上,会强制被传送到 传送阵的另一头。
现在请你帮助love8909算一算,他至少需要走多少步才能解 救到小Q?
Input
第一行为一个整数T,表示测试数据组数。
每组测试数据第一行为两个整数N,M,(1≤N,M≤50)表示
迷宫的长和宽。
接下来有N行,每行M个字符,是迷宫的具体描述。
.表示安全的位置#表示陷阱,Q表示小Q的位置L表示love8909所在位置,
数据保证love8909只有一个,数据也保证小Q只有一个。
小写字母a-z表示分别表示不同的传送阵,数据保证传送阵
两两配对。
Output
每组数据输出一行,解救小Q所需的最少步数,如果无论如何都 无法救小Q,输出-1。
Sample input and output
| Sample Input | Sample Output |
|---|---|
2 5 5 |
3 |
这道题采用广度优先搜索,每走过一个地方计算这个地方离起点的距离,并将这个点加入队列。不过要注意的是对应传送门的深度是相同的。为方便
#include<iostream>
#include<queue>
#include<string.h>
#define MAX_N 50
#define MAX_M 50
#define INF 3000
using namespace std; typedef pair<int, int> P;
char maze[MAX_N + 5][MAX_M + 5];//迷宫
int d[MAX_N + 5][MAX_M + 5];//表示离起点的距离
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
P door[MAX_N + 5][MAX_M + 5];//储存传送门的对应关系
bool flag[MAX_N + 5][MAX_M + 5];//记录节点是否被访问过
int lx, ly, qx, qy;
int N, M; void input()
{
P temp[28];
cin >> N >> M;
fill(temp, temp + 28, P(INF, INF));
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
door[i][j].first = door[i][j].second = INF;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
{
char m;
cin >> m;
maze[i][j] = m;
if (m >= 'a' && m <= 'z')
{
if (temp[m - 'a'] == P(INF, INF))//传送门第一次出现
temp[m - 'a'] = P(i, j);
else//传送门已经出现过了
{
door[i][j] = P(temp[m - 'a'].first, temp[m - 'a'].second);
door[temp[m - 'a'].first][temp[m - 'a'].second] = P(i, j);
}
}
else if (m == 'L'){lx = i; ly = j; maze[i][j] = '#';}
else if (m == 'Q'){ qx = i; qy = j; }
}
} int bfs()
{
memset(flag, 0, sizeof(flag));
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
d[i][j] = INF;
queue<P> que;
que.push(P(lx, ly));//将起点加入队列
d[lx][ly] = 0;//并将起点的距离赋为0
while (!que.empty())//不断循环,知道队列为空
{
int nx, ny;
P now = que.front();//当前节点
que.pop();
if (now.first == qx&&now.second == qy)
break;
for (int i = 0; i < 4; i++)//向四个方向遍历
{
nx = now.first + dx[i];
ny = now.second + dy[i];
if (nx < N && nx >= 0 && ny < M && ny >= 0 && !flag[nx][ny])//未超边界,且未访问过
{
if (maze[nx][ny] <= 'z'&&maze[nx][ny] >= 'a')//传送门
{
int dnow = d[now.first][now.second];
d[door[nx][ny].first][door[nx][ny].second] = dnow + 1;//传送
que.push(P(door[nx][ny].first, door[nx][ny].second));//将传送后的节点加入队列
}
else if (maze[nx][ny] != '#')//不是传送门
{
d[nx][ny] = d[now.first][now.second] + 1;
que.push(P(nx, ny));
}
flag[nx][ny] = 1;//将节点标记为访问过
}
}
}
return d[qx][qy];
} int main()
{
int T;
cin >> T;
for (int t = 0; t < T; t++)
{
input();
int res = bfs();
cout << (res == INF ? -1 : res);
if (t < T - 1)
cout << endl;
}
return 0;
}
CDOJ_149 解救小Q的更多相关文章
- TOJ 2939 解救小Q
描述 小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她.迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头. ...
- UESTC149 解救小Q
小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她.迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头.现在请你 ...
- bzoj3007 解救小云公主
3007: 解救小云公主 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 159 Solved: 71 [id=3007" style=&q ...
- 平面直接坐标系线段相交问题(小Q(钟神)的问题)
[问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...
- 剑指Offer——网易笔试之解救小易
知识要点 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3 ...
- hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)T ...
- HD4505小Q系列故事——电梯里的爱情
Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q ...
- hdu4505小Q系列故事——电梯里的爱情
小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- HDU-4515 小Q系列故事——世界上最遥远的距离
小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) ...
随机推荐
- Altium Designer入门学习笔记1.软件安装与资料收集
一.软件安装 微信:http://url.cn/5Eudzt9 关注微信公众号"软件安装管家",点击"软件目录",弹出"软件目录",点击进入 ...
- List删除元素
在单线程环境下的解决办法 public void remove() { if (lastRet == -1) throw new IllegalStateException(); checkForCo ...
- P3391 【模板】文艺平衡树(Splay)新板子
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- CodeForces 489F DP Special Matrices
首先统计一下前m行中,有x列1的个数为0,有y列1的个数为1. 设d(i, j)表示有i列1的个数为0,有j列1的个数为1,能到达这个状态的矩阵的个数. 则d(x, y) = 1 每一行都是两个1一起 ...
- NetBeans无法使用编码GBK安全地打开该文件
今天用NetBeans打开包含路径里面的UTF-8编码的文件时,提示:NetBeans无法使用编码GBK安全地打开该文件. 后来在网上搜索找到了解决方案,原文地址:http://qdjinxin.it ...
- jQuery 样式操作、文档操作、属性操作的方法总结
文档操作: addClass() 向匹配的元素添加指定的类名.after() 在匹配的元素之后插入内容.append() ...
- C语言知识点(4)
一.while. dowhile. 1.while while (表达式) { 语句: … 语句: } 2.while do { printf(“%d/n,I);…}while (i<=1 ...
- 九度oj 题目1085:求root(N, k) 清华2010年机试题目
题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的k进制表示的各位数字之和.输入x,y,k,输出root(x^y,k)的值 (这里^ ...
- 如何使用Python的logging模块
几个学习连接: Python官方链接: https://docs.python.org/3.4/library/logging.html?highlight=logging 翻译(不过是2.3版本的) ...
- iOS学习笔记29-系统服务(二)通讯录
一.通讯录 iOS中的通讯录是存储在数据库中的,由于iOS的权限设计,开发人员是不允许直接访问通讯录数据库的,实现通讯录操作需要使用到AddressBook.framework框架. AddressB ...