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) ...
随机推荐
- Mysqli的常用函数
Mysqli的常用函数 连接数据库: $res = @mysqli_connect($host,$username,$pass,$db_name); if (mysqli_connect_errno( ...
- Codeforces 559A(计算几何)
A. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Django的form,model自定制
一.Form组件原理: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证 ...
- MySQL基础架构
前段时间订阅了<Mysql实战45讲>(从原理到实战),新的一年为自己充充电.对于这部分内容,我所知道的只来源于我大学里学习的课程<数据库原理>,在大学里学习的只是简单的查询, ...
- zedboard硬件连接过程
1. ZedBoard – Connect a 2nd micro-USBcable between the host machine and connector J17 (JTAG) 2. ...
- 【Todo】C++和Java里面的浮点数及各种数字表示
今天看了这篇文章,是讲C++中的浮点类型的:<浮点数的二进制表示> 再复习一下Java里面的Float和Double. 首先,直接数字赋值给Float变量是不行的,数字后要加上F,这样写: ...
- Word 2013安裝字典
不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 ...
- HDU1542Atlantis(扫描线)
HDU1542Atlantis(扫描线) 题目链接 题目大意:给你n个覆盖矩形,问最后覆盖的面积. 解题思路:将每一个矩形拆成两条线段,一条是+1的,还有一条是减1的.然后扫描先从上往下扫描,碰到加1 ...
- sql里的in对应linq的写法 及 IQueryable转化为Dictionary
string[] arID = { "0001", "0002" }; var dict = this.service.GetMyList(m => ar ...
- cxf与struts2拦截器冲突的解决方案
最近学习接口,学习了下cxf,用tomcat部署访问的时候,发现接口不能访问:百度了很多,最终找到比较好的解决方案: sturts2配置: <!-- 设置strus拦截器 --> < ...