Description有一副n*m的地图,有n*m块地,每块是下列四种中的一种:
墙:用#表示,墙有4个面,分别是前面,后面,左面,右面。
起点:用C表示,为主角的起点,是一片空地。
终点:用F表示,为主角的目的地,是一片空地。
空地:用 . 表示。
其中除了墙不能穿过,其他地方都能走。主角有以下3种操作:
1.移动到相邻的前后左右的地方,花费一个单位时间。
2.向前后左右其中一个方向发射子弹,子弹沿直线穿过,打在最近的一堵墙的一面,然后墙的这面就会形成一个开口通往秘密通道。同一时间最多只能有两个开口,若出现有3个开口,出现时间最早的开口会立即消失。该操作不用时间。
3.可以从一个与开口相邻的空地跳进去,进入秘密通道,从另外一个开口正对的空地跳出来。这个过程花费一个单位时间。地图四周都是墙,问主角最少用多少时间从C走到F。C和F
只会出现一次。

先说说我之前的解法吧,估计有问题
因为打枪不消耗时间,所以随便走就可以了。
然后我打了搜索
其实完全可以再进一步
向四周连边,再向墙连边,边权为最近的墙的距离。
跑一遍Dijkstra就行,但是注意不能反向边
因为从To到From的情况和From到To是不一样的,To和From所处的位置本就不同

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 505;
char Map[MAXN][MAXN];
int Stx,Sty,Edx,Edy;
int Dis[MAXN * MAXN];
int n,m;
struct _Edge{int Next;int To;int Wei;
} Edge[MAXN * MAXN * 10];
int Head[MAXN * MAXN],Cnt;
void Add(int u,int v,int w) {Cnt ++;Edge[Cnt].Next = Head[u];Edge[Cnt].To = v;Edge[Cnt].Wei = w;Head[u] = Cnt;
}
struct _Wall{int x,y;
} Wall[10];
struct Unit{int x;int w;bool operator < (const Unit & a) const {return w > a.w;}
};
int Loss[7][7] = {{1,0},{-1,0},{0,1},{0,-1}};
int Vis[MAXN * MAXN];
void Dijkstra() {priority_queue<Unit> que;memset(Dis,0x3f,sizeof(Dis));Dis[(Stx - 1) * n + Sty] = 0;que.push((Unit) {(Stx - 1) * n + Sty,0});while(!que.empty()) {int x = que.top().x;que.pop();if(Vis[x]) continue;Vis[x] = 1;for(int i = Head[x]; i; i = Edge[i].Next) {int y = Edge[i].To;if(Dis[x] + Edge[i].Wei < Dis[y]) {Dis[y] = Dis[x] + Edge[i].Wei;if(!Vis[y]) que.push((Unit) {y,Dis[y]});}}}
}
int main() {freopen("portal.in","r",stdin);freopen("portal.out","w",stdout);scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++) {scanf("%s",Map[i] + 1);for(int j = 1; j <= m; j++) {if(Map[i][j] == 'C') {Stx = i;Sty = j;}if(Map[i][j] == 'F') {Edx = i;Edy = j;}}}for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {int From = (i - 1) * n + j;if(Map[i][j] != '#') {int x = i,y = j;int tx = x,ty = y,d = 10000;while(Map[tx][ty] != '#') tx --;Wall[1].x = tx;Wall[1].y = ty;d = min(d,x - tx);tx = x,ty = y;while(Map[tx][ty] != '#') tx ++;Wall[2].x = tx;Wall[2].y = ty;d = min(d,tx - x);tx = x,ty = y;while(Map[tx][ty] != '#') ty --;Wall[3].x = tx;Wall[3].y = ty;d = min(d,y - ty);tx = x,ty = y;while(Map[tx][ty] != '#') ty ++;Wall[4].x = tx;Wall[4].y = ty;d = min(d,ty - y);for(int k = 1; k <= 4; k++) {int To = (Wall[k].x - 1 + Loss[k - 1][0]) * n + Wall[k].y + Loss[k - 1][1];Add(From,To,d);}for(int k = 0; k < 4; k++) {int tx = i + Loss[k][0],ty = j + Loss[k][1];if(tx < 1 || tx > n || ty < 1 || ty > m || Map[tx][ty] == '#') continue;int To = (tx - 1) * n + ty;Add(From,To,1);}}}}Dijkstra();if(Dis[(Edx - 1) * n + Edy] != 0x3f3f3f3f)cout << Dis[(Edx - 1) * n + Edy];else cout << "nemoguce";return 0;
}

JZOJ 5781 秘密通道相关推荐

  1. [2020-11-30 contest]数列(矩阵加速),秘密通道(dijkstra最短路)小X游世界树(换根dp),划分(数学)

    文章目录 数列 solution code 秘密通道 solution code 小X游世界树 solution code 划分 solution code 数列 a[1]=a[2]=a[3]=1 a ...

  2. jzoj5781 秘密通道

    题目点这里(需要jzoj账号) - 首先我们看到这道题,这道题的基本是走迷宫,我们都做过类似的题,这道题只是在此基础上多了一个可以传送的条件 - 我们这样去想,对于一个点,它可以往上下左右四个方向射出 ...

  3. Google的秘密通道

    http://www.google.com/microsoft 微软风格的入口 http://www.google.com/mac MAC风格的入口 http://www.google.com/lin ...

  4. 电报注册_更秘密的电报

    电报注册 We used to think of Telegram as a reliable and secure transmission medium for messages of any s ...

  5. 淘宝内部员工购物通道

    2012新版淘宝内部员工VIP秘密通道 如果你有过网购经历,你一定知道淘宝网,你知道购物就到淘宝网首页找,但你肯定不知道淘宝网还有各种内部员工购物通道,从这里进入全是淘宝网的品质商家,不担心受骗上 这 ...

  6. 2014天猫双11内部员工购物通道

    这个时候已经敲响了双11的警钟了,这一定是大家最紧张最激动的时刻,抢红包.抢干货.挖宝贝:小编却在紧张的备战,上午一个在阿里从事数据库管理员的朋友发给我一份文件,说是双11所有店 铺折扣商品总汇,我开 ...

  7. 你不可不知的《哈利波特》秘密

    一.哈利波特有两个祖先是威森加摩成员. 哈利的曾祖父亨利(Herry)是威森加摩成员,他的朋友喜欢叫他哈利,而哈利·詹姆·波特的名字可能来源于此. 另一个只是被JK罗琳透露了,没说名字. 二.罗恩是个 ...

  8. 黑客带来了病毒攻击软件还是文化?

    在互联网飞速发展的今天,我们的网民数量正在以每分钟百人的速度激增着.就在这互联网遍及千家万户的时候,有那么一些有着自己理想.抱负的青年,正活跃在互联网的各个角落.他们是IT界的精英,他们熟知各个网站. ...

  9. iOS引入第三发库引发的错误linker command failed with exit code 1

    引入第三发库导致项目崩溃 常见出错日志: Apple Mach-O Linker Error Group linker command failed with exit code 1 (use -v ...

最新文章

  1. OpenBoard的板级支持包(BSP)开发召集令
  2. 未来计算在“云-端”
  3. 爬虫单个ip代理设置_爬虫怎么设置代理ip池?
  4. Python基础(8)_迭代器、生成器、列表解析
  5. c语言逗号占几个字符,C语言 scanf输入多个数字只能以逗号分隔的操作
  6. php 删除上传文件,php实现文件上传、下载和删除的方法
  7. java jdbc mysql url_java – 如何生成JDBC数据库URL?
  8. 让微信扫描直接下载你的APK
  9. java 斗地主 案例
  10. leetcode题库124-- 二叉树中的最大路径和
  11. UFS Write Booster Feature Overview
  12. python 3维正态分布图_使用python绘制3维正态分布图的方法
  13. springboot springsecurity报错 **.LoginUser cannot be cast to **.LoginUser
  14. 爬虫-大众点评评论信息(思路)
  15. HTML+CSS 绘制太阳系各个行星运行轨迹
  16. Python 最强 IDE 详细使用指南!
  17. 使用padding-bottom设置div的高度跟父元素的宽度相关联
  18. 爬虫03 —— 正则表达式
  19. 编写完10万行代码,我发了篇长文吐槽Rust
  20. 医院wifi覆盖解决方案

热门文章

  1. python异常处理中不会用到的关键字_Python异常处理中不会用到的关键字是
  2. VS2013 运行报错:有未经处理的异常 0xC0000005
  3. js 指定光标位置
  4. 打开VMware虚拟机时提示“内部错误”
  5. 微信公众平台开发--快递查询
  6. iphone计算机快捷键,PC 上的 iTunes 键盘快捷键
  7. 查找和排序算法总结(c语言)
  8. python 协程 (概念+示例代码)
  9. word中批量修改、替换公式格式
  10. wps启用编辑按钮在哪里_如何在wps工具栏中添加按钮 如何在Excel中添加删除命令按钮...