题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1180/

题目和不同的bfs有个不同的地方就是存在横着的或者竖着的楼梯,楼梯每过一个时刻就改变一次横竖的走向,人可以通过楼梯到达楼梯另一端的位置而只花费1的时间。所以我们只要在遇到楼梯的位置查看楼梯当前的走向,判断和人的横竖方向是否相同就行,相同则花费1时间,不同则花费2时间。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
#define maxn 25
int n,m,t;
int sx,sy,tx,ty;
int dir[][]={,,-,,,,,-};//横向与纵向
bool vis[maxn][maxn];
char Map[maxn][maxn];
struct node{
int x,y,step;
node(int x,int y,int s):x(x),y(y),step(s){}
node(){}
friend bool operator < (node a,node b)
{
return a.step>b.step;//由于优先队列是以最大为顶,所以就反向定义操作符使得最小step为顶
}
};
node cur,nxt;
bool ok(node a)
{
return a.x>&&a.x<=n&&a.y>&&a.y<=m&&Map[a.x][a.y]!='*'&&!vis[a.x][a.y];
}
int bfs()
{
mem(vis,false);
priority_queue<node>q;
q.push(node(sx,sy,));
vis[sx][sy]=;
while(!q.empty())
{
cur=q.top();
q.pop();
if(cur.x==tx&&cur.y==ty)
{
return cur.step;
}
f(i,,)
{
nxt=cur;
nxt.x+=dir[i][];
nxt.y+=dir[i][];
nxt.step++;
if(nxt.x<||nxt.x>n||nxt.y<||nxt.y>m||Map[nxt.x][nxt.y]=='*')continue;
if(vis[nxt.x][nxt.y])continue;
if(Map[nxt.x][nxt.y]=='|'||Map[nxt.x][nxt.y]=='-')//只要有楼梯就经过的原则,不放过任何一种状态
{
char c=Map[nxt.x][nxt.y];//注意不能改变Map[cur.x][cur.y]的值,要让它保持原来的状态
if(nxt.step&)//步数为奇数时需要变换楼梯
{
if(c=='|')c='-';
else c='|';
}
nxt.x+=dir[i][];
nxt.y+=dir[i][];
if((c=='|'&&(i<=))||(c=='-'&&(i>)))//横向走时楼梯是纵向或者纵向走时楼梯是横向
{
nxt.step++;
}
if(!ok(nxt))continue;
if(nxt.x<||nxt.x>n||nxt.y<||nxt.y>m||Map[nxt.x][nxt.y]=='*')continue;
if(vis[nxt.x][nxt.y])continue;//每次状态(位置)改变时都要查询访问记录
}
vis[nxt.x][nxt.y]=;//注意每次一种状态入队都要设置访问记录
q.push(nxt);
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(scanf("%d%d",&n,&m)!=EOF)
{
f(i,,n)
f(j,,m)
{
scanf(" %c",&Map[i][j]);
if(Map[i][j]=='S')sx=i,sy=j;
if(Map[i][j]=='T')tx=i,ty=j;
}
pf("%d\n",bfs());
}
}

hdu1180 诡异的楼梯 bfs的更多相关文章

  1. hdu 1180 诡异的楼梯 (bfs)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Sub ...

  2. hdu 1180诡异的楼梯(bfs)

    诡异的楼梯 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submis ...

  3. HDU1180:诡异的楼梯(bfs+优先队列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1180 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里, ...

  4. hdu - 1180 诡异的楼梯 (bfs+优先队列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1180 注意点就是楼梯是在harry移动完之后才会改变方向,那么只要统计到达这个点时间奇偶性,就可以知道当前楼梯是 ...

  5. HDU1180:诡异的楼梯

    传送门 题意 迷宫搜索 分析 这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据 trick 1.遇到梯 ...

  6. hdu1180奇怪的楼梯……bfs迷阵……wa该16二级,我太渣滓

    #include<iostream> #include<queue> #include<cstring> using namespace std; int row, ...

  7. 诡异的楼梯(bfs)hdu1180

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submiss ...

  8. HDU 1180 诡异的楼梯(BFS)

    诡异的楼梯 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. hdu 1180:诡异的楼梯(BFS广搜)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

随机推荐

  1. HEXO进阶打赏

    HEXO接近是最近有一些朋友提出的问题,然后我做了总结,如果你也在使用HEXO,不妨看看,应该会有些帮助. 1.博客部署样式出问题了怎么办? 2.电脑重装或者误删了本地博客怎么办? 3.想使用两台电脑 ...

  2. Java里观察者模式(订阅发布模式)

    创建主题(Subject)接口 创建订阅者(Observer)接口 实现主题 实现观察者 测试 总结 在公司开发项目,如果碰到一些在特定条件下触发某些逻辑操作的功能的实现基本上都是用的定时器 比如用户 ...

  3. 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)

    针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频, ...

  4. 达拉草201771010105《面向对象程序设计(java)》第九周学习总结

    达拉草201771010105<面向对象程序设计(java)>第九周学习总结 实验九异常.断言与日志 实验时间 2018-10-25 1.实验目的与要求 (1) 掌握java异常处理技术: ...

  5. 目标用户偏好指数Target Group Index分析

    目标用户偏好指数Target Group Index分析 TGI指数,全称Target Group Index,可以反映目标群体在特定研究范围内强势或者弱势. TGI指数计算公式 = 目标群体中具有某 ...

  6. 一篇文章带您读懂Map集合(源码分析)

    今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...

  7. SQL语句中in 与 exists的区别

    SQL语句中in 与 exists的区别 SQL中EXISTS检查是否有结果,判断是否有记录,返回的是一个布尔型(true/false); IN是对结果值进行比较,判断一个字段是否存在于几个值的范围中 ...

  8. [转帖]RSYNC 的核心算法

    RSYNC 的核心算法 https://coolshell.cn/articles/7425.html rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并 ...

  9. 【WPF学习】第五十七章 使用代码创建故事板

    在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...

  10. 10个机器学习人工智能开发框架和AI库(优缺点对比表)/贪心学院

    概述 通过本文我们来一起看一些用于人工智能的高质量AI库,它们的优点和缺点,以及它们的一些特点. 人工智能(AI)已经存在很长时间了.然而,由于这一领域的巨大进步,近年来它已成为一个流行语.人工智能曾 ...