Problem Description

在一个N*M的地图上旅行。地图上有些地方可以走用. 表示,不能走用 # 表示。在可以走的地方上下左右移动一格需要一个单位时间。可以走的地方还有一些时空之门。时空之门可以减少旅行的时间。如果 A 到 B 有一道时空之门,那么从 A 到 B 经过时空之门只要 1 个单位时间。在一个点可以有很多门通向其他的不同点。现在 john 在 s 点,他想以最快的时间到 t 点。求出最短时间。

Input

输入包含多组数据输入数据第一行两个正整数 N M (1< n,m <= 500) 接着 N 行,每行 M 个字符 表示地图。#表示不可走,.表示可以走,s表示开始位置,t表示终止位置。一个地图中只有一个s与1个t. 接着 N*M 行,给出每个点的时空之门。按行优先给出,即给出的顺序为(1,1),(1,2) ….. (1,m) ,(2,1)....(2,m)....。 每行第一个数 K 表示该点的时空之门数,接着给出 K 个点,表示该点通向这k个点的时间为1。其中时空之门的个数不超过100000。对于50%的数据,时空之门的个数为0 在给出的数据中,不能走的点#的时空之门数一定为0,且没有通向不能走的点的时空之门。

Output

s 到 t 的最短时间。数据保证s可以走到t。

Sample Input

2 2
s#
t.
0
0
0
0

Sample Output

1
讲解:其实现在看来还算是一个常规的题目,但是当时想着时空门,这个还关于跳跃越过去的问题,于是乎不知道该怎么写了,后来参考了一下学长的意见,似乎有点明白了,自己又写了一遍,供大家参考一下:
代码如下:
 #include<algorithm>
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define N 505
#define M 505
int n,m,step,si,sj,ti,tj,dir[][]={{,},{-,},{,},{,-}};
char map[N][M];
bool flag[N][M];
struct point{
int x,y;
point (int x,int y):x(x),y(y){}
};
vector<point>v[N][M];//把vector容器变为数组型的容器,方便数据的存储,
struct node
{
int x,y,t;
node(int x,int y,int t):x(x),y(y),t(t){}
node(){}
};
queue<node>q;
void bfs()
{
while(!q.empty())
q.pop();
q.push(node(si,sj,));
map[si][sj]='#';
int x,y,t;
node n1;
while(!q.empty())
{
n1=q.front();q.pop();
for(int i=;i<;i++)//常规的四个方向的寻找
{
x=n1.x+dir[i][];
y=n1.y+dir[i][];
if(map[x][y]!='#')
{
t=n1.t+;
map[x][y]='#';
if(x==ti && y==tj)
{
step=t;
return ;
}
q.push(node (x,y,t));
}
}
int len=v[n1.x][n1.y].size();
for(int i=;i<len;i++)//取出满足条件的点,进行穿梭,然后再进行存储;
{
x=v[n1.x][n1.y][i].x;
y=v[n1.x][n1.y][i].y;
if(map[x][y]!='#')
{
t=n1.t+;
map[x][y]='#';
if(x==ti && y==tj)
{
step=t;
return ;
}
q.push(node (x,y,t));
}
}
}
}
int main()
{
int i,j;
while(cin>>n>>m)
{
memset(map,'#',sizeof(map));
getchar();
for( i = ; i <= n; ++i )
{
gets(map[i]+);
for( j = ; j <= m; ++j )
{
v[i][j].clear();
if( map[i][j] == 's' ) si = i, sj = j;
else if( map[i][j] == 't' ) ti = i, tj = j;
}
}
int k,xx,yy;
for( i = ; i <= n; ++i )
{
for( j = ; j <= m; ++j )
{
scanf("%d", &k);
while(k--)
{
scanf("%d%d", &xx, &yy);
v[i][j].push_back(point(xx,yy));//这个二维的容器很好用,我也是刚学会的
}
}
}
bfs();
cout<<step<<endl;
}
return ;
}
 

FZU Problem 2028 时空门问题的更多相关文章

  1. FZU Problem 2028 时空门问题(DFS+优化)

    一开始是MLE,后来想到了用vector,化二维为一维,做了这一步优化后,这就是很基础的一个广搜了 #include<iostream> #include<cstdio> #i ...

  2. FZu Problem 2233 ~APTX4869 (并查集 + sort)

    题目链接: FZu Problem 2233 ~APTX4869 题目描述: 给一个n*n的矩阵,(i, j)表示第 i 种材料 和 第 j 种材料的影响值,这个矩阵代表这n个物品之间的影响值.当把这 ...

  3. FZu Problem 2236 第十四个目标 (线段树 + dp)

    题目链接: FZu  Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...

  4. 翻翻棋(找规律问题)(FZU Problem 2230)

    题目是这样的: FZU Problem 2230 象棋翻翻棋(暗棋)中双方在4*8的格子中交战,有时候最后会只剩下帅和将.根据暗棋的规则,棋子只能上下左右移动,且相同的级别下,主动移动到地方棋子方将吃 ...

  5. FZU 2028 时空门问题

    题目链接:时空门问题 简单bfs,每个格子移动的方式除了上下左右,还有时空门,开始想着用邻接表保存每个点能通过时空门到达的点就ok了.很快的敲出来,很快的WA了.长久的dbug并没有发现error.然 ...

  6. fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)

    题目:http://acm.fzu.edu.cn/problem.php?pid=2148 题意:给出n个点,判断可以组成多少个凸四边形. 思路: 因为n很小,所以直接暴力,判断是否为凸四边形的方法是 ...

  7. fzu Problem 2140 Forever 0.5(推理构造)

    题目:http://acm.fzu.edu.cn/problem.php?pid=2140 题意: 题目大意:给出n,要求找出n个点,满足: 1)任意两点间的距离不超过1: 2)每个点与(0,0)点的 ...

  8. Fzu Problem 2082 过路费 LCT,动态树

    题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528    Submit: 1654Time Limit ...

  9. FZU Problem 2169 shadow

    http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在很多城市.除了王都外有K个城市有军队, ...

随机推荐

  1. sublime Text3 JsFormat

    https://github.com/sprinng/JsFormat 下载解压 放到 首选项 --> 浏览插件目录 重启sublime ctrl+shift+p 安装 使用: 右键JsForm ...

  2. uploadify上传之前判断一个input输入框是否为空

    onUploadStart:function(file){ if ($("#ContractCode").val() == "") { alert(" ...

  3. python之函数用法getattr()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法getattr() #getattr() #说明: ''' getattr(...) ...

  4. Megcup 2017 决赛第一题 规则

    2017Megcup 2017Megcup决赛第三题题解 只做出了一道题,虽然慢慢地退出了前128名,但还是要记录一下. 10点钟开始,一看第一题很熟悉,因为研究过格点图中电流问题,其实就是求解线性方 ...

  5. 【LeetCode】45. Jump Game II

    Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...

  6. hadoop集群虚拟机配置

    hadoop_1, hadoop_2, hadoop_3 用户名riluo 密码19841984 查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4) 安装好的CentOS会自带O ...

  7. Android快速开发不可或缺的11个工具类(下载)

    功能分类:工具     支持平台:Android     运行环境:Eclipse 开发语言:Java      开发工具:Eclipse         源码大小:11.45KB   下载地址:ht ...

  8. DataTime? 的 GetValueOrDefault() 方法

    DataTime? 转换为 DataTime类型 就可以调用 ToString()  自定义格式 @item.CreateDate.GetValueOrDefault().ToString(" ...

  9. 转:http协议学习

    协议详解篇 2.1 HTTP/1.0和HTTP/1.1的比较 RFC 1945定义了HTTP/1.0版本,RFC 2616定义了HTTP/1.1版本. 笔者在blog上提供了这两个RFC中文版的下载地 ...

  10. RHCE7 管理II-3使用VIM编辑器

    vim的不同版本: 1.vim-minial 提供vi和相关命令.在RHEL 7的最小安装中 2.vim-enhanced 提供vim命令.提供语法突出显示.文件类型插件和拼写检查等功能 3.vim- ...