hdu1180 优先队列bfs+判断方向
诡异的楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 14267 Accepted Submission(s):
3638
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
**..T
**.*.
..|..
.*.*.
S....
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
char e[25][25];
int n,m,T;
int xa,ya,xb,yb;
int fx[4][2]={-1,0,1,0,0,-1,0,1};
int book[25][25];
struct node
{
int x,y,t;
bool operator<(const node& ch)const{
return t>ch.t;}
};
void walk(int zt,int &dx,int& dy,int i) //zt : 1表示'|',2表示’-‘
{
if(zt==1){ //楼梯此时为竖状时,根据上下分为两种情况,只能是上下因为已经在bfs里处理过,方向上下走的定是上下楼梯,反之亦然
if(i==0) dx--;
else dx++;
}
else if(zt==2){
if(i==2) dy--;
else dy++;
}
}
void bfs()
{
node temp,cur;
priority_queue<node> q;
temp.x=xa,temp.y=ya,temp.t=0;
book[xa][ya]=1;
q.push(temp);
while(!q.empty()){//cout<<"1";
temp=q.top(),q.pop();
for(int i=0;i<4;i++){
cur=temp;
int dx=cur.x+fx[i][0];
int dy=cur.y+fx[i][1];
if(e[dx][dy]=='|'){
if(cur.t%2==0){ //台阶状态不变为'|'
if(i<2) walk(1,dx,dy,i); //走的是上下方向
else
cur.t++,walk(2,dx,dy,i); //走的是左右方向,等一秒
}
else{
if(i<2) cur.t++,walk(1,dx,dy,i);
else walk(2,dx,dy,i);
}
}
else if(e[dx][dy]=='-'){
if(cur.t%2==0){
if(i>=2) walk(2,dx,dy,i);
else cur.t++,walk(1,dx,dy,i);
}
else{
if(i>=2) cur.t++,walk(2,dx,dy,i);
else walk(1,dx,dy,i);
}
}
cur.t++;
//cout<<"2";
if(dx<1||dy<1||dx>n||dy>m||book[dx][dy]||e[dx][dy]=='*') continue;
book[dx][dy]=1;
cur.x=dx;
cur.y=dy;
if(dx==xb&&dy==yb) {cout<<cur.t<<endl;return;}
q.push(cur);
//cout<<dx<<" "<<dy<<endl;
}
}
}
int main(){
int i,j;
while(cin>>n>>m){memset(book,0,sizeof(book));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>e[i][j];
if(e[i][j]=='S') xa=i,ya=j;
if(e[i][j]=='T') xb=i,yb=j;
}
bfs();
}
return 0;
}
总结:
记得把出发点push进队列md,还有就是不要急于更改最新点的变量,因为有些判断操作可能要用到之前的变量!
+++:
还有就是queue写时注意book[dx][dy]保存(dx,dy)到起点的最小距离,注意加条件(if(cur.t>=book[dx][dy]) continue);如果不加‘=’TLE,Because会造成大量的重复解进入导致内存占用过度
hdu1180 优先队列bfs+判断方向的更多相关文章
- hdu 1026 Ignatius and the Princess I【优先队列+BFS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- ZOJ 649 Rescue(优先队列+bfs)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 【POJ3635】Full Tank 优先队列BFS
普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解. 优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解. 且对于优先队列BFS来说, ...
- Codeforces 677D - Vanya and Treasure - [DP+优先队列BFS]
题目链接:http://codeforces.com/problemset/problem/677/D 题意: 有 $n \times m$ 的网格,每个网格上有一个棋子,棋子种类为 $t[i][j] ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- hdu-5652 India and China Origins(二分+bfs判断连通)
题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- 最短路径问题,BFS,408方向,思路与实现分析
最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...
- 3305: Hero In Maze II (优先队列+bfs)
Description 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^.突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了, ...
- BFS(判断状态) HDOJ 3533 Escape
题目传送门 题意:一个人从(0, 0)逃往(n, m),地图上有朝某个方向开炮的炮台,问最少逃脱步数 分析:主要在状态是否OK,当t时刻走到(x,y),炮台是否刚好打中,因为只能是整数,所以用整除判断 ...
随机推荐
- 返回xml过长时被nginx截断的解决办法
返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...
- python之路----黏包的解决方案
黏包的解决方案 远程执行命令 # server 下发命令 给client import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) ...
- 修改Nginx配置文件来隐藏index.php
找到你要修改的域名对应nginx配置文件(vhost下),添加如下代码 location / { if (!-e $request_filename) { rewrite ^(.*)$ /index. ...
- 20145213《网络对抗》逆向及Bof基础
实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...
- Duilib应用修改程序图标方法(转载)
转载:http://www.cnblogs.com/lanzhi/p/6468596.html 本文向大家介绍如何修改duilib应用图标,对于win32或者mfc应用来说,我们可以在注册窗口类时指定 ...
- Java求两个数平均值
如何正确的求2个数的平均值.在练习算法二分查找的时候发现的,以前没有注意到的bug 备注:数据以int类型为例 一.以前的通用写法 /** * 求a+b平均值 * @param a * @param ...
- Python3基础 list 推导式 生成与已知列表等长度+元素为0的列表
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python3基础 str count 获得子字符串出现的次数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- LTE-A 载波聚合(Carrier Aggregation)介绍【转】
本文转自:https://blog.csdn.net/txgc1009/article/details/46467255 载波聚合(Carrier Aggregation) 首先介绍几个基本概念 Pr ...
- WebForm、MVC、流式计算
11月.NET技术讨论会圆满结束,会议纪要及相关文档如下如下: 1.WebForm预编译演示 文档:http://gitlab.light.fang.com/kongguDonet.Demo/Pre ...