诡异的楼梯 HDU1180

Posted bxd123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了诡异的楼梯 HDU1180相关的知识,希望对你有一定的参考价值。

这题做了很久  

做好了感觉很简单。。。 现在做题思路更加清晰了 

一个要点就是   当楼梯过不去的时候不能是先过去时间加2  必须得回去等一秒   否则queue的时间顺序会被打破

 

技术分享图片
#include<bits/stdc++.h>
using namespace std;

int sx,sy,ex,ey;int n,m;
char m1[31][31];
bool f[31][31];


struct node
{
    int x,y,d;
    node(int x=0,int y=0,int d=0):x(x),y(y),d(d){}
};



void bfs()
{
    memset(f,false,sizeof(f));
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    node u(sx,sy,0);
    queue<node>q;
    q.push(u);

    while(!q.empty())
    {
        u=q.front();q.pop();
       //  printf("%d %d %d
",u.x,u.y,u.d);
        if(u.x==ex&&u.y==ey){printf("%d
",u.d);return;}

        for(int i=0;i<4;i++)
        {
            node v(u.x+dx[i],u.y+dy[i],u.d+1);

            if(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m&&m1[v.x][v.y]!=*)
            {

              if(m1[v.x][v.y]==|)
              {
                  if(i==0||i==2)//shuiping
                  {
                      if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);}

                       else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];q.push(v);}


                  }
                 if(i==1||i==3)
                 {
                     if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];f[v.x][v.y]=true;q.push(v);}

                       else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);}
                 }


              }



                 if(m1[v.x][v.y]==-)
              {
                  if(i==0||i==2)//shuiping
                  {
                      if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];q.push(v);}

                       else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);}


                  }
                 if(i==1||i==3)
                 {
                     if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);}

                       else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];f[v.x][v.y]=true;q.push(v);}
                 }


              }








                else if(f[v.x][v.y]==false&&(m1[v.x][v.y]==.||v.x==ex&&v.y==ey))
                {
                    f[v.x][v.y]=true;q.push(v);
                }


            }



        }



    }





}





int main()
{

    while(scanf("%d%d",&n,&m)==2)
    {
       for(int i=1;i<=n;i++)
       {
           scanf("%s",m1[i]+1);
           for(int j=1;j<=m;j++)
           {
               if(m1[i][j]==S){sx=i;sy=j;}
               if(m1[i][j]==T){ex=i;ey=j;}


           }


       }



          //  printf("%d %d %d %d
",sx,sy,ex,ey);
         bfs();
       //printf("pl");

    }





    return 0;
}
View Code

 

以上是关于诡异的楼梯 HDU1180的主要内容,如果未能解决你的问题,请参考以下文章

诡异的楼梯 HDU1180

HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)

杭电acm 1180 诡异的楼梯 BFS

hdu 1180(广搜好题)

HDU 诡异的楼梯 (bfs)

1180: 零起点学算法87——超级楼梯(有疑问)