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),炮台是否刚好打中,因为只能是整数,所以用整除判断 ...
随机推荐
- Linux下Oracle常用命令
1. 备份表 exp database_user/pass tables='(table1,table2)' file=filename.dmp(例如:exp ismrenbao/iflytek ta ...
- Linux学习笔记之Centos7安装GNOME桌面环境
最小化安装Centos7,系统默认是命令行界面,如果像我一样有特殊需求,这时就需要我们手动来安装用户图形界面了. 1.查看一下当前的运行级别和可以安装的group. systemctl get-def ...
- Python入门之logging模块
本章目录: 一.logging模块简介 二.logging模块的使用 三.通过JSON或者YMAL文件配置logging模块 ===================================== ...
- 写给java程序员的c++与java实现的一些重要细微差别-附完整版pdf学习手册
0.其实常规的逻辑判断结构.工具类.文件读写.控制台读写这些的关系都不大,熟悉之后,这些都是灵活运用的问题. 学习c/c++需要预先知道的一个前提就是,虽然有ANSI C标准,但是每个c/c++编译器 ...
- 20145220韩旭飞《网络对抗》Exp2 后门原理与实践
20145220韩旭飞<网络对抗>Exp2 后门原理与实践 常用后门工具实践 Windows获得Linux Shell 在Windows下,先使用ipconfig指令查看本机IP: 使用n ...
- duilib中edit获得鼠标焦点后右边框被覆盖
转载:http://www.cnblogs.com/minggong/p/6457734.html 用duilib做了一个窗口,窗口内有一个供用户输入使用的是edit控件. XML中是这样写的: &l ...
- return false break;
js中的return false; break; , , , , ]; var list2 = ['a', 'b', 'c', 'd']; ; j < list2.length; j++) { ...
- 【第三章】 springboot + jedisCluster
如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制.(具体使用方式:第九章 企业项目开发--分布式缓存Redis(1) 第十章 企业项目开发--分布式缓存Redis(2)) 如果 ...
- YOLO(Darknet官方)训练分类器
目录 1. 分类数据准备 2. Darknet配置 3. Darknet命令使用 4. cifar-10 使用示例 1. 分类数据准备 需要的文件列表: 1. train.list : 训练的图片的绝 ...
- NS3 一个小问题
可能会在执行./waf 命令的时候遇到这个问题,比如我想编译 /home/wasdns/Documents/NS3/ns-3.17/scratch 目录下的一个文件:newnsthree.cpp 编译 ...