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) ...
随机推荐
- PHP 常见问题3
1,Http 和 Https 的区别 第一:http 是超文本传输协议,信息是明文传输,https 是具有安全性的 ssl 加密传输协议 第二:http 和 https 使用的是完全不同的连接方式,端 ...
- OC-runtime 的温习
-.runtime简介 runtime简称运行时,OC就是运行时机制,也就是运行时的一些机制,其中最主要的是消息机制: 对于C语言,函数的调用在编辑的时候,会决定调用哪个函数: 对于OC的函数,属于动 ...
- IP聚合 ---百度之星(与运算)
Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址.网 ...
- Unique Paths II (dp题)
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- 各种Js插件汇总;JavaScript插件
1.jquery信息提示插件: https://blog.csdn.net/u013517229/article/details/78291841 http://www.jqueryfuns.com/ ...
- Linux 常用检测命令
1.uptime [root@smgsim02 ~]# uptime 15:08:15 up 98 days, 4:19, 2 users, load average: 0.07, 0.29, ...
- 一例Ext4文件系统fsck后损坏的修复过程
1.故障发生背景 Ext4文件系统没有umount下来,之后做了fsck操作检查一致性,结果导致Ext4文件mount不上(有时也会表现为导致目录变成了文件). 报错提示信息:mount: wrong ...
- 【C】字符串,字符和字节(C与指针第9章)
C语言没有一种显式的数据类型是字符串的. C语言存储字符串:字符串常量(不能改动).字符数组或动态分配的内存(能够改动) *************************************** ...
- 学习Opencv 2.4.9 (一)---Opencv + vs2012环境配置
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 首先获得最新的Opencv 2.4.9源代码:opencv源代码下载 一.Opencv环境变量配置 ...
- java.lang.ClassCastException: $Proxy0 cannot be cast to javax.servlet.ServletRequestWrapper
我是在myeclipse 8.5使用代理的时候遇到这个问题的.因为我是跟着视频敲的,所以按道理代码是不会有问题..最后经过我百折不挠的折腾,我发现问题的根源 是 myeclipse自带的tomcat. ...