[NC15665]maze
题目描述:
小明来到一个由n x m个格子组成的迷宫,有些格子是陷阱,用’#‘表示,小明进入陷阱就会死亡,’.'表示没有陷阱。小明所在的位置用’S’表示,目的地用’T’表示。
小明只能向上下左右相邻的格子移动,每移动一次花费1秒。
有q个单向传送阵,每个传送阵各有一个入口和一个出口,入口和出口都在迷宫的格子里,当走到或被传送到一个有传送阵入口的格子时,小明可以选择是否开启传送阵。如果开启传送阵,小明就会被传送到出口对应的格子里,这个过程会花费3秒;如果不开启传送阵,将不会发生任何事情,小明可以继续向上下左右四个方向移动。
一个格子可能既有多个入口,又有多个出口,小明可以选择任意一个入口开启传送阵。使用传送阵是非常危险的,因为有的传送阵的出口在陷阱里,如果小明使用这样的传送阵,那他就会死亡。也有一些传送阵的入口在陷阱里,这样的传送阵是没有用的,因为小明不能活着进入。请告诉小明活着到达目的地的最短时间。
题解:
这里与平时bfs不同的一点是,他可以进行传送,但是这个传送他耗费的时间是3s,跟普通移动是不一样的,所以可能存在花费时间长但是移动距离却不如普通移动的距离远的问题,所以这里我们就不可以用普通的队列来解决这个问题了,想一下bfs队列里面的思想,就是考花费时间短的在队列前面从而解决的问题,所以我们这里可以用到优先队列(按照其花费时间由小到大排序)。
还有一个问题是如何记录传送门呢?
我们可以开一个二维结构体来记录,如果对应的坐标有相应的结果,那么我们就可以把他直接传到对应的位置,耗时3s,在继续进行普通的走动。
要注意一点就是通过传送门传过去那一点你是不可以把他标记为false的,因为你不确定是不是普通的移动比他耗时还少。
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 310;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
char a[maxn][maxn];
bool visited[maxn][maxn];
int n,m,q;
int mins=MaxN;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct wazxy{int x,y,steps;wazxy(int a,int b,int c){x=a,y=b,steps=c;}bool operator < (const wazxy & a)const{return steps>a.steps;}
};
struct door{int x,y;
}ma[maxn][maxn];
void init(){memset(visited,false,sizeof(visited));memset(a,-1,sizeof(a));memset(ma,0,sizeof(ma));mins=MaxN;
}
bool bfs(int x,int y){priority_queue<wazxy> q;q.push(wazxy(x,y,0));while(!q.empty()){wazxy temp=q.top();q.pop();if(a[temp.x][temp.y]=='T'){mins=temp.steps;return true;}if(ma[temp.x][temp.y].x!=0&&!visited[ma[temp.x][temp.y].x][ma[temp.x][temp.y].y]&&a[ma[temp.x][temp.y].x][ma[temp.x][temp.y].y]!='#'){q.push(wazxy(ma[temp.x][temp.y].x,ma[temp.x][temp.y].y,temp.steps+3));}for(int i=0;i<4;i++){int nx=temp.x+dx[i];int ny=temp.y+dy[i];if(!visited[nx][ny]&&(a[nx][ny]=='.'||a[nx][ny]=='T')){visited[nx][ny]=true;q.push(wazxy(nx,ny,temp.steps+1));}}}return false;
}int main()
{while(cin>>n>>m>>q){init();for(int i=1;i<=n;i++){scanf("%s",a[i]+1);}for(int i=0;i<q;i++){int x,y,ex,ey;scanf("%d%d%d%d",&x,&y,&ex,&ey);x++,y++,ex++,ey++;ma[x][y].x=ex,ma[x][y].y=ey;}bool flag=false;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]=='S'){if(bfs(i,j)) flag=true;}}}if(flag) cout<<mins<<endl;else cout<<-1<<endl;}
}
[NC15665]maze相关推荐
- nc15665 maze 题解 (传送门) 广搜bfs+优先队列
maze:原题链接 题目描述: 小明来到一个由n x m个格子组成的迷宫 ,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱.小明所在的位置用'S'表示,目的地用'T'表示. 小 ...
- [A Dangerous Maze LightOJ - 1027 ][概率题]
A Dangerous Maze LightOJ - 1027 题目大意:就是你有nnn个门每次你都会随机选一个门,这个门对应得数值如果是负的那么你将会在aia_iai的时间后回到原来位置,如果是正 ...
- (POJ 3026) Borg Maze 最小生成树+bfs
题目链接:http://poj.org/problem?id=3026. DescriptionThe Borg is an immensely powerful race of enhanced h ...
- 【POJ 3026】Borg Maze
[POJ 3026]Borg Maze 一个考察队搜索alien 这个考察队能够无限切割 问搜索到全部alien所须要的总步数 即求一个无向图 包括全部的点而且总权值最小(最小生成树 BFS+最小生成 ...
- C++rat maze老鼠迷宫算法(附完整源码)
rat maze老鼠迷宫的算法 rat maze老鼠迷宫的算法的完整源码(定义,实现,main函数测试) rat maze老鼠迷宫的算法的完整源码(定义,实现,main函数测试) #include & ...
- [Mummy Maze] 宽度优先搜索
有个小游戏ms很有意思 叫Mummy Maze 这边有一个下载地址 有兴趣的可以试试 http://www.jz5u.com/Soft/games/chess/20301.html 我也在玩 不过我写 ...
- Solve The Maze CodeForces - 1365D(贪心+dfs)
Vivek has encountered a problem. He has a maze that can be represented as an n×m grid. Each of the g ...
- NEKO's Maze Game(思维)
3R2 as DJ Mashiro - Happiness Breeze Ice - DJ Mashiro is dead or alive NEKO#ΦωΦ has just got a new m ...
- HDU 4035 Maze
Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...
最新文章
- 【扩展推荐】Intervention/image 图片处理
- java计数器策略模式_策略模式与外观模式 | 学步园
- 最新全球权威AI基准测试榜单:浪潮和NVIDIA霸榜了
- zip() python
- 按行拼接两个txt文件的python实现
- java获取客服列表,java-从列表中获取处理案例的服务
- yii2环境搭建(ubuntu下nginx+php+mysql+yii2)
- macOS应用程序打开时出现崩溃的情况,怎样处理?
- Windows 7 纯净版各版本下载
- plc输入/输出模块的选择
- 信捷plc485通信上位机_常用通信接口汇总
- Python制作2048小游戏
- 有趣的 Google command line shell
- 文件打开模式r,w,a,r+,w+,a+的区别和联系
- python有道翻译
- 生信软件 | FastQC(质量控制,查看测序质量)
- 国外问卷调查是不是骗人的?
- Robocup2D入门笔记(1)——概述
- 关于一些C语言代码优化的方法,我慷慨解囊了大家酌情收藏
- 2021全球与中国自动导引车市场现状及未来发展趋势