题目描述
CYJ想找到他的小伙伴FPJ,.CYJ和FPJ现在位于一个房间里,这个房间的布置可以看成一个N行M列的矩阵,矩阵内的每一个元素会是下列情况中的一种:
1.障碍区域—这里有一堵墙(用‘#’表示).
2.这是CYJ最开始在的区域(用‘C’表示).
3.这是FPJ在的区域(用‘F’表示).
4.空区域(用‘.’表示).
CYJ携带了一个所谓传送枪的东西,这是一把可以创造传送门的枪械,在每一次行动中,他可以选择下列操作中的一项:
1.移向一个相邻的格子中(上,下,左,右,不能移到墙在的格子里).这个操作要消耗一个单位的时间.
2.转向一个墙(不需要相邻,只需面向即可),向其发射传送门,传送门会留在墙内面向你的地方(至多只能同时存在两扇传送门),若墙上已经有两扇传送门,而你发射了第三扇,那么最初发射的那一扇会消失。同时,你无法在一个位置制造两扇传送门(这个操作不会耗费时间)。
3.如果他与一块墙壁相邻且面前有一扇传送门,那么他可以移动到另一扇传送门前方的格子。这个操作会耗费一个单位的时间.
CYJ想要知道自己最少需要多少时间才能够从起点(‘C’)到达终点(‘F’).
请注意:我们保证地图边缘会是一圈墙壁且一定存在‘C’,‘F’.

输入
第一行输入两个正整数 N 和 M ,(4 ≤ N,M ≤ 500).表示地图大小。
接下来的N行每行一个长度为M的字符串.表示地形。

输出
你需要输出最少的到达终点的时间,如果不能到达请输出”no”。

样例输入
【样例1】
4 4

#.F#
#C.#

【样例2】
6 8
########
#.##…F#
#C.##…#
#…#…#
#…##
########
【样例3】
4 5

#C#.#
###F#

样例输出
【样例1】
2
【样例2】
4
【样例3】
no

提示
样例2解释:
从C点(3,2)开始,我们首先向左发射传送门,再向下发射传送门,向左进入传送门,到达(5,2),向右发射传送门,向下进入传送门,到达(5,6),向上发射传送门,向右进入传送门,到达(2,6),向右移动,到达F.

【数据范围】
50%的数据满足:4<= N,M <=15;
100%的数据满足:4<= N,M <=500;

思路
对每个非墙点,都有至多八种方式连边,即向上下左右四个方向走一步,或向上下左右四个方向的墙面最近点移动,在连边后,直接跑dijkstra即可

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=505;
const int M=3e5;
const int INF=0x3f3f3f3f;
const ll LINF=1e18;
const ull sed=31;
const ll mod=998244353;
const double eps=1e-7;
const double PI=3.14159265358979;
typedef pair<int,int>P;
typedef pair<double,double>Pd;template<class T>void read(T &x)
{x=0;int f=0;char ch=getchar();while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=f?-x:x;return;
}
struct qnode
{int v,c;qnode(int _v=0,int _c=0):v(_v),c(_c){}bool operator < (const qnode &r) const{return c>r.c;}
};struct node
{int to,index,w;
}E[M<<3];int head[M],cnt,n,m;
int dis[M],dist[N][N];
P cw[4][N][N];
int ar[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool vis[M];
char mp[N][N];
int s,e;
queue<P>que;inline int cal(P t)
{return (t.first-1)*m+t.second;
}
void add(int u,int v,int w)
{E[++cnt].to=v;E[cnt].w=w;E[cnt].index=head[u];head[u]=cnt;
}void dji()
{for(int i=1;i<=n*m;i++){dis[i]=INF;vis[i]=false;}priority_queue<qnode>que;que.push(qnode(s,0));dis[s]=0;while(!que.empty()){qnode top=que.top();que.pop();int u=top.v;if(vis[u]) continue;vis[u]=true;for(int i=head[u];i;i=E[i].index){int v=E[i].to,cost=E[i].w;if(!vis[v] && dis[v]>dis[u]+cost){dis[v]=dis[u]+cost;que.push(qnode(v,dis[v]));}}}
}void bfs()
{while(!que.empty()){P top=que.front();que.pop();for(int i=0;i<4;i++){int ax=top.first+ar[i][0],ay=top.second+ar[i][1];if(ax>0 && ay>0 && ax<=n && ay<=m && !dist[ax][ay] && mp[ax][ay]=='.'){dist[ax][ay]=dist[top.first][top.second]+1;que.push(P(ax,ay));}}}
}int main()
{read(n);read(m);for(int i=1;i<=n;i++){scanf("%s",mp[i]+1);for(int j=1;j<=m;j++){if(mp[i][j]=='C'){mp[i][j]='.';s=cal(P(i,j));}else if(mp[i][j]=='F'){mp[i][j]='.';e=cal(P(i,j));}else if(mp[i][j]=='#') que.push(P(i,j));}}bfs();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(mp[i][j]=='#') continue;for(int k=0;k<2;k++){int ax=i+ar[k][0],ay=j+ar[k][1];if(ax>0 && ay>0 && ax<=n && ay<=m){if(mp[ax][ay]=='#') cw[k][i][j]=P(i,j);else cw[k][i][j]=cw[k][ax][ay];}}}}for(int i=n;i>0;i--){for(int j=m;j>0;j--){if(mp[i][j]=='#') continue;for(int k=2;k<4;k++){int ax=i+ar[k][0],ay=j+ar[k][1];if(ax>0 && ay>0 && ax<=n && ay<=m){if(mp[ax][ay]=='#') cw[k][i][j]=P(i,j);else cw[k][i][j]=cw[k][ax][ay];}}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(mp[i][j]=='#') continue;for(int k=0;k<4;k++){int ax=i+ar[k][0],ay=j+ar[k][1];if(k>=2 && ax>0 && ay>0 && ax<=n && ay<=m && mp[ax][ay]=='.'){add(cal(P(ax,ay)),cal(P(i,j)),1);add(cal(P(i,j)),cal(P(ax,ay)),1);}if(cw[k][i][j]!=P(i,j)) add(cal(P(i,j)),cal(cw[k][i][j]),dist[i][j]);}}}dji();if(dis[e]==INF) puts("no");else printf("%d\n",dis[e]);return 0;
}

走格子(bfs+dji)相关推荐

  1. NOIP模拟测试14「旋转子段·走格子·柱状图」

    旋转子段 连60分都没想,考试一直肝t3,t2,没想到t1最简单 我一直以为t1很难,看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a ...

  2. 蓝桥杯 python 走迷宫 BFS

    蓝桥杯 python 走迷宫 BFS 题目描述 给定一个 N × × × M 的网格迷宫 G.GG的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示). 已知迷宫的入口位置为 ( ...

  3. 【51NOD】1486 大大走格子

    [算法]动态规划+组合数学 [题意]有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数. [题解] 大概能考虑到离散化黑点后,中间的空格子直接用组合数计算. 然后解决 ...

  4. 51nod 1344 走格子【贪心/前缀和】

    1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...

  5. 【有趣的Python小程序】Python多个简单上手的库制作WalkLattice 走格子游戏 (思路篇)上

    篇写上一个思路篇,那么今天我们就来完成这一项工作 源代码和配套文件 链接: https://caiyun.139.com/m/i?135ClY1yWrSKX 提取码:e4pq 复制内容打开中国移动云盘 ...

  6. 【动态规划】机器人走迷宫-BFS

    机器人走迷宫-BFS 题目描述:给一个矩阵,0代表可走位置,1代表障碍物 给定起点和终点和行走规则(上.下.左.右),输出最短路径 探寻最短路径-BFS 首先定义两个辅助函数,valid_action ...

  7. 1344 走格子 (前缀和)

    有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i] > 0,机器 ...

  8. Wannafly挑战赛17 - 走格子(模拟)

    题目链接 题目描述 在平面上有n*n大小的正方形,定义正方形左下角坐标是(1,1),右下角坐标是(n,1) 现在A君在左下角,他的初始方向是向右,他要在正方形内走m步 当A君碰到边界或者已经走过的格子 ...

  9. 201301 JAVA2~3级---走格子

    请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往 ...

  10. 【51Nod - 1344】走格子 (思维)

    题干: 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数Aii,表示这个格子的能量值.如果Aii > 0, ...

最新文章

  1. [原创]Java性能优化权威指南读书思维导图
  2. Java中使用HashMap,TreeSet和List来实现模拟斗地主的洗牌和发牌的小例子
  3. JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】
  4. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)
  5. C++多重继承师生类复盘
  6. Oracle学习总结(9)—— Oracle 常用的基本操作
  7. Dubbo自定义日志拦截器 1
  8. c语言操作题和答案,C语言上机操作题及答案.doc
  9. android平板电脑 刷机工具,小白必看,安卓平板电脑刷机教程之一键刷机
  10. python共享单车数据分析_利用python分析共享单车项目
  11. matlab:圆形的图像识别(一)
  12. Android多媒体相关框架
  13. 2008服务器打不开iso文件,Windows Server无法挂载ISO文件:以下是修复它的方法
  14. 如何合理选择AI加速器?
  15. win10底部任务栏无响应 解决办法
  16. WPS公式标号对齐,公式居中问题
  17. 基于移动端的民宿预订app
  18. 全面解析ThreadLocal
  19. 需求:定义老师和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽出一个父类,用继承的方式改写代码,并进行测试
  20. 拿着卖白菜的钱,操着卖白粉的心

热门文章

  1. 2018在职计算机科学硕士申请,2018年哪些学校计算机在职研究生专业比较好
  2. 计算机的控制面板打不开,控制面板打不开,教您控制面板打不开怎么办
  3. 记住看小电影前一定要检查网址是不是 HTTPS 的,不然…
  4. 每周论文精读04——A Survey on 3D Hand Pose Estimation: Cameras, Methods, and Datasets
  5. idea关闭自动更新
  6. 惠普服务器安装系统流程,惠普服务器怎样安装系统?
  7. 色彩空间与色彩深度。详细分析相机中sRGB/AdobeRGB、RAW/JPG到底该怎么选
  8. 【Eclipse】eclipse在文件夹下可以打开,桌面快捷方式报错
  9. 三星pay显示连接服务器失败,Samsung Pay刚刚上线就遇绑卡失败,三星闹哪样?
  10. 【转载】C++ 内存分配(new,operator new)详解