HDU1180:诡异的楼梯
传送门
题意
迷宫搜索
分析
这题写起来挺简单的,锻炼搜索基本功,一开始用记忆化搜索TLE了,改用访问标记,0ms过了,用优先队列保证终点最快达到,我会在代码中提供一些强力数据
trick
1.遇到梯子分能过(+1s)与不能过(+2s)入队列
2.一定有可行解
代码
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
int m,n,sx,sy,ex,ey,ans;
char s[25];
int mp[25][25],vis[25][25];
struct node
{
int x,y,time;
bool operator<(const node &p)const
{
return time>p.time;
}
};
int a[4][2]={0,1,1,0,0,-1,-1,0};
priority_queue<node>pq;
bool check(int x,int y)
{
if(x<1||y<1||x>m||y>n||vis[x][y]||mp[x][y]==0) return 0;return 1;
}
void bfs()
{
node tmp;
tmp.x=sx,tmp.y=sy,tmp.time=0;
while(!pq.empty()) pq.pop();
pq.push(tmp);
ans=0;mem(vis,0);
vis[sx][sy]=1;
while(!pq.empty())
{
tmp=pq.top();pq.pop();
if(tmp.x==ex&&tmp.y==ey) { ans=tmp.time;return ; }
R(i,0,4)
{
int xx=tmp.x+a[i][0],yy=tmp.y+a[i][1];
if(mp[xx][yy]==2||mp[xx][yy]==3)
{
if(mp[xx][yy]==2)
{
if((tmp.time+i)&1)
{
if(!check(xx+a[i][0],yy+a[i][1])) continue;
node p={xx+a[i][0],yy+a[i][1],tmp.time+1};
pq.push(p);vis[p.x][p.y]=1;
continue;
}
else
{
if(!check(xx+a[i][0],yy+a[i][1])) continue;
node p={xx+a[i][0],yy+a[i][1],tmp.time+2};
pq.push(p);vis[p.x][p.y]=1; continue;
}
}
else
{
if((tmp.time+i)%2==0)
{
if(!check(xx+a[i][0],yy+a[i][1])) continue;
node p={xx+a[i][0],yy+a[i][1],tmp.time+1};
pq.push(p);vis[p.x][p.y]=1; continue;
}
else
{
if(!check(xx+a[i][0],yy+a[i][1])) continue;
node p={xx+a[i][0],yy+a[i][1],tmp.time+2};
pq.push(p);vis[p.x][p.y]=1; continue;
}
}
}
else
{
if(!check(xx,yy)) continue;
node p={xx,yy,tmp.time+1};
vis[p.x][p.y]=1;
pq.push(p);
}
}
}
}
int main()
{
while(scanf("%d %d",&m,&n)!=EOF)
{
F(i,1,m)
{
scanf("%s",s);
F(j,0,n-1)
{
if(s[j]=='S') sx=i,sy=j+1;
if(s[j]=='T') ex=i,ey=j+1;
mp[i][j+1]=1;
if(s[j]=='*') mp[i][j+1]=0;
if(s[j]=='|') mp[i][j+1]=2;
if(s[j]=='-') mp[i][j+1]=3;
}
}
bfs();
printf("%d\n",ans);
}
return 0;
}
/*
附上几组测试数据
5 5
**..T
**.*.
**|..
**.**
S..**
5 5
**..T
**.*.
**-..
**.**
S..**
5 5
.|.-T
-*-*|
.*.|.
-*-**
S|.**
5 5
S....
-|-|-
.....
-|-|-
....T
1 3
S-T
1 3
S|T
1 5
S|.|T
1 5
S-.-T
1 5
S|.-T
1 5
S-.|T
答案是:
8 7 7 8 1 2 4 3 3 2
*/
HDU1180:诡异的楼梯的更多相关文章
- HDU1180:诡异的楼梯(bfs+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1180 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里, ...
- hdu1180 诡异的楼梯 bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1180/ 题目和不同的bfs有个不同的地方就是存在横着的或者竖着的楼梯,楼梯每过一个时刻就改变一次横竖的走向,人可 ...
- 诡异的楼梯(bfs)hdu1180
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submiss ...
- hdu 1180 诡异的楼梯
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- hdu 1180 诡异的楼梯 (bfs)
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Sub ...
- HDU 1180 诡异的楼梯(BFS)
诡异的楼梯 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 1180诡异的楼梯(bfs)
诡异的楼梯 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Submis ...
- hdu 1180:诡异的楼梯(BFS广搜)
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- Git学习之常见错误 git push 失败
Git学习之常见错误 git push 失败 问题描述: git push Counting objects: , done. Delta compression using up to thread ...
- Javascript标准事件模型
本文为原创,转载请注明出处: cnzt 文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6676913.html 1. 分类 IE -- 冒泡型 现代 ...
- windows安装ZIP压缩版的Weblogic Server
以前要装Weblogic Server的时候都是装的安装版,最近发现ZIP版本的Weblogic Server是一个只包含Weblogic Server的版本,于是就想着弄一下它. 这里用到的Webl ...
- curl -L 跟随跳转
curl -L 跟随跳转 加上-v 就可以看见详细信息: 学习了:https://www.cnblogs.com/davicelee/archive/2011/11/19/cURL.html http ...
- 【安卓笔记】抽屉式布局----DrawerLayout
效果例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- HTML的DIV如何实现垂直居中
外部的DIV必须有如下代码 display:table-cell; vertical-align:middle; 这样可以保证里面的东西,无论是DIV还是文本都可以垂直居中
- 一起talk C栗子吧(第九十六回:C语言实例--使用共享内存进行进程间通信二)
各位看官们.大家好,上一回中咱们说的是使用共享内存进行进程间通信的样例,这一回咱们接着上一回内容继续说使用共享内存进行进程间通信. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...
- rand和srand的用法(转载)
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数)表头文件: #include<stdlib.h> ...
- python的线程thread笔记
python的线程是用thread和threading来实现的.其中利用threading会更好,因为thread没有线程保护,当主线程退出了之后,子线程也会被强行退出.threading支持守护线程 ...
- CUDA编程(十)使用Kahan's Summation Formula提高精度
CUDA编程(十) 使用Kahan's Summation Formula提高精度 上一次我们准备去并行一个矩阵乘法.然后我们在GPU上完毕了这个程序,当然是非常单纯的把任务分配给各个线程.也没有经过 ...