hdu1180诡异的楼梯(bfs)

来源:互联网 发布:淘宝网背带裤 编辑:程序博客网 时间:2024/06/02 10:57

这道题的意思是哈利波特要从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 3S|T*/
0 0
原创粉丝点击