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装饰者模式
php装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 示例: A.B.C编辑同一篇文章. class ...
- P2839 畅通工程
P2839 畅通工程 题目描述 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...
- 在访问RESTful接口时出现:Could not write content: No serializer found for class的问题解决小技巧收集
注意:市面上对于写RESTful是用RestFul,其实是不规范的,标准写法RESTful. 在Java上,处理这个应该是没有继承Serializable类,然后通过Eclipse生成serialVe ...
- html页面中拍照和上传照片那些事儿(一)
本文为原创,转载请注明出处: cnzt 文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6709037.html 一. 思路: <input type= ...
- HDU 4786 Fibonacci Tree(生成树,YY乱搞)
http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...
- C语言取整方法总结
C语言有下面几种取整方法: 1. 直接赋值给整数变量 int i = 3.5; 或 i = (int) 3.5; 这样的方法採用的是舍去小数部分. 2.整数除法运算符' / '取整 ' / ...
- 【LeetCode】Swap Nodes in Pairs 链表指针的应用
题目:swap nodes in pairs <span style="font-size:18px;">/** * LeetCode Swap Nodes in Pa ...
- Lucene中TokenStream,Tokenizer,TokenFilter,TokenStreamComponents与Analyzer
TokenStream extends AttributeSource implements Closeable: incrementToken,end,reset,close Tokenizer直接 ...
- 积跬步,聚小流------ps有用小技巧,改变png图标颜色
* 实现效果: 原图: 改动后: * 实现目的: 满足为实现不同界面色彩搭配改动png图标的颜色 * 实现方法: 1.打开Photoshop工具,导入须要进行改动的png图标: 2.对导入的图 ...
- 报错:Binary XML file line #7: Error inflating class android.support.v7.widget.RecyclerView
近期学习RecyclerView,使用eclipse引用RecyclerView.编写完demo后编译没有问题,一执行就挂掉,错误例如以下: 07-22 23:05:34.553: D/Android ...