您的位置:首页 > 其它

hdu1180诡异的楼梯(bfs)

2016-10-02 15:49 423 查看
这道题的意思是哈利波特要从S走到T,中间有那种会改变方向的楼梯,经过楼梯的话一共只用一秒,但是可能会存在有特殊的楼梯会一秒改变一次方向,也就是说可能会等一秒,不会有两个楼梯连续挨着,还有很重要的一点就是,你不能再楼梯上呆一秒,所以当你找到楼梯的时候,不能把他直接压进队列,要直接对它进行处理,然后把处理过的压进队列,这点一定要切记,再者就是在遇到楼梯的时候,先用步数的奇偶来判断此时楼梯的方向,然后看此时自己的方向和楼梯的方向是否为同一个方向,然后就很好操作了

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
char s[30][30];
bool vis[30][30];
int dir[30][30];
int xx[4][2]= {{0,-1},{0,1},{1,0},{-1,0}};
struct sa
{
int x,y,step;
friend bool operator<(sa a,sa b)
{
return a.step>b.step;
}
} a,p,t;
priority_queue<sa>q;
int m,n;
int solve()
{
while(!q.empty())
{
sa a=q.top();
q.pop();
for(int i=0; i<4; i++)
{
int nx=a.x+xx[i][0];
int ny=a.y+xx[i][1];
if(nx>=0&&nx<m&&ny>=0&&ny<n)
{
char c;
if(s[nx][ny]=='T')
return a.step+1;
else if(s[nx][ny]=='.'&&!vis[nx][ny])
{
p.x=nx;
p.y=ny;
p.step=a.step+1;
vis[nx][ny]=1;
q.push(p);
}

else if(s[nx][ny]=='|'||s[nx][ny]=='-')
{
if(a.step%2==1)
{
if(s[nx][ny]=='-')
c='|';
else if(s[nx][ny]=='|')
c='-';
}
else c=s[nx][ny];
p.x=nx+xx[i][0];
p.y=ny+xx[i][1];
if(c=='|'&&(xx[i][1]==1||xx[i][1]==-1))
p.step=a.step+1;
else if(c=='-'&&(xx[i][0]==1||xx[i][0]==-1))
p.step=a.step+1;
else p.step=a.step;
//vis[p.x][p.y]=1;
/* cout<<c<<" "<<xx[i][0]<<" "<<xx[i][1]<<endl;
cout<<a.step<<endl;
cout<<p.step<<endl;*/
if(p.x>=0&&p.x<m&&p.y>=0&&p.y<n)
{
if(s[p.x][p.y]=='T')
{
return p.step+1;
}
else if(!vis[p.x][p.y])
{
p.step+=1;
vis[p.x][p.y]=1;
q.push(p);
}
}
}
}
}
}

return 0;
}
int main()
{
while(cin>>m>>n)
{
while(!q.empty())
q.pop();
memset(dir,0,sizeof(dir));
memset(s,0,sizeof(s));
memset(vis,0,sizeof(vis));
memset(s,0,sizeof(s));
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
cin>>s[i][j];
if(s[i][j]=='S')
{
t.x=i;
t.y=j;
t.step=0;
vis[i][j]=1;
q.push(t);
}
if(s[i][j]=='|')
dir[i][j]=1;
if(s[i][j]=='-')
dir[i][j]=-1;
}
}
int ans=solve();
cout<<ans<<endl;
}
return 0;
}
/**
1 3
S|T
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs 图论