一开始是MLE,后来想到了用vector,化二维为一维,做了这一步优化后,这就是很基础的一个广搜了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
using namespace std;
#define maxn 510
char maps[maxn][maxn];
vector<int>v[maxn*maxn];
int vis[maxn][maxn],go[][] = {,,,,,-,-,},n,m;
struct Pos
{
int x,y,s;
}node;
bool ok(Pos a)
{
return (a.x>= && a.x<n && a.y>= && a.y<m && maps[a.x][a.y] != '#' && !vis[a.x][a.y]);
}
int bfs(Pos a,Pos b)
{
queue<Pos> que;
memset(vis,,sizeof(vis));
while(!que.empty()) que.pop();
vis[a.x][a.y] = ;
que.push(a);
while(!que.empty())
{
Pos now = que.front();
que.pop();
if(now.x == b.x && now.y == b.y) return now.s;
Pos nxt;
for(int i = ;i < ;i++)
{
nxt.x = now.x + go[i][];
nxt.y = now.y + go[i][];
if(ok(nxt))
{
vis[nxt.x][nxt.y] = ;
nxt.s = now.s + ;
que.push(nxt);
}
}
int s = now.x*m + now.y;
for(int i = ;i < v[s].size();i++)
{
nxt.x = v[s][i] / m;
nxt.y = v[s][i] % m;
if(ok(nxt))
{
vis[nxt.x][nxt.y] = ;
nxt.s = now.s + ;
que.push(nxt);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
Pos node1,node2;
for(int i = ;i < n;i++)
scanf("%s",maps[i]);
int k,x,y,st,en;
for(int i = ;i < n;i++)
{
for(int j = ;j < m;j++)
{
if(maps[i][j] == 's')
node1.x = i,node1.y = j,node1.s = ;
else if(maps[i][j] == 't')
node2.x = i,node2.y = j,node2.s = ;
st = i*m + j;
v[st].clear();
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&x,&y);
x--,y--;
en = x*m + y;
v[st].push_back(en);
}
}
}
printf("%d\n",bfs(node1,node2));
}
}

FZU Problem 2028 时空门问题(DFS+优化)的更多相关文章

  1. FZU Problem 2028 时空门问题

    Problem Description 在一个N*M的地图上旅行.地图上有些地方可以走用. 表示,不能走用 # 表示.在可以走的地方上下左右移动一格需要一个单位时间.可以走的地方还有一些时空之门.时空 ...

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

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

  3. 2019牛客多校第二场F Partition problem 暴力+复杂度计算+优化

    Partition problem 暴力+复杂度计算+优化 题意 2n个人分成两组.给出一个矩阵,如果ab两个在同一个阵营,那么就可以得到值\(v_{ab}\)求如何分可以取得最大值 (n<14 ...

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

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

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

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

  6. FZU Problem 1895 整除45问题(整除问题+字符串维护+优化)

    这个题有点烧脑啊,但是只要想清楚被45整除的数,肯定能被5和9整除,能被9整除的数各位加起来肯定是9的倍数,能被5整除的末尾是0或5. 然后dfs的过程稍微不太好懂,还有几个优化必须要注意.dfs的过 ...

  7. FZU 2028 时空门问题

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

  8. fzu Problem 2198 快来快来数一数 (快速幂+优化)

    题目链接: Problem  2198  快来快来数一数 题目描述: 给出n个六边形排成一排,a[i]代表i个六边形能组成的生成树个数,设定s[i]等于a[1]+a[2]+a[3]+....+a[i- ...

  9. ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪

    FZU 2150 Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

随机推荐

  1. OpenCV中Mat的列向量归一化

    OpenCV中Mat的列向量归一化 http://blog.csdn.net/shaoxiaohu1/article/details/8287528 OpenCV中Mat的列向量归一化 标签: Ope ...

  2. PHP 5 数据类型

    本页内容来自http://www.runoob.com/php/php-datatypes.html String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型 ...

  3. weka简介

    1.weka的历史 1992年末,新西兰怀卡托大学计算机科学系Ian Written博士申请基金. 1993年获新西兰政府资助,并于同年开发出接口和基础架构. 1994年发布了第一个weka的内部版本 ...

  4. 第7章 一个java源文件中只能有一个public类

    一个Java源文件中最多只能有一个public类, 1)当有一个public类时,源文件名必须与之一致,否则无法编译, 2)如果源文件中没有一个public类,则文件名与类中没有一致性要求. 至于ma ...

  5. Away 3d 框架

    卷 工作资料 的文件夹 PATH 列表 卷序列号为 00000200 F8B8:EE5E E:. │  tree.txt │  tree1.txt │   ├─away3d │  │  .DS_Sto ...

  6. 客户端 HttpUtils.java

    package com.http.post; import java.io.ByteArrayOutputStream; import java.io.IOException; import java ...

  7. Entity Framework 学习中级篇3—存储过程(中)

    目前,EF对存储过程的支持并不完善.存在以下问题: l         EF不支持存储过程返回多表联合查询的结果集. l         EF仅支持返回返回某个表的全部字段,以便转换成对应的实体.无法 ...

  8. linuxmint更改权限

    sudo chmod -R 777 要更改的目录或文件

  9. strictmode

    最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了 ...

  10. wpf之ListBox横向显示所有ListBoxItem

    Xaml: <Window x:Class="WpfApplication6.MainWindow" xmlns="http://schemas.microsoft ...