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. C++AMP介绍(一)

    C++AMP介绍(一) 最后更新日期:2014-05-02 阅读前提: 环境:Windows 8.1 64bit英文版,Visual Studio 2013 Professional Update1英 ...

  2. MISRA-C 2012 C90规范和C99规范对比

  3. js replace 如何替换字符串中的最后一个匹配项

    1.正则表达时,贪婪模式,.*会一直匹配到最后一个 // 验证 let str = "123[空]345[空]789[空]0"; let res = str.replace(/(. ...

  4. ViewPager切换动画效果改动

    比方我们点击向右button,希望左边的view移动过来,有个平移效果,可是用系统默认的ViewPager切换的时候,会一闪而过. 这是为什么呢? 由于viewpager外面事实上有个scrollvi ...

  5. 编译时:virtual memory exhausted: Cannot allocate memory(转)

    一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩 ...

  6. UrlConnection的代理和返回状态码的问题

    今天写了一段代码想在service里访问一个外部网站,在service的方法里写了如下代码 System.setProperty("http.proxyType", "4 ...

  7. php计算经纬度间的距离

    <?php //根据经纬度计算距离 function getdistance($lng1,$lat1,$lng2,$lat2) { //将角度转为狐度 $radLat1=deg2rad($lat ...

  8. MySQL 获取子分类ID的所有父分类ID和Name的集合

    CREATE DEFINER=`sa`@`%` PROCEDURE `proc_Product_leimu_ParentIds`( IN pID INT ) BEGIN ) vars, product ...

  9. Android Fragment之间传递List数据

    要说的是在两个Fragment之间传递List数据,比如有个List<User>,以及传递字符串数据,比如testId,该如何从FragmentA传递到FragmentB呢? 下面这个例子 ...

  10. 《JAVA与模式》之参考资料

    1.书籍 <JHead First 设计模式(中文版)> <JAVA与模式> <大话设计模式> 2.连接地址 http://blog.csdn.net/jason0 ...