HDU 1180题 诡异的楼梯

 题目链接~~>

                     这题其实很简单,在走楼梯时只要判断是否能走就可以,如果不能走,可以选择等下一分钟再走,还有一点就是楼梯不能标记,可以从不同方向过。

代码:

#include<stdio.h>
#include<queue>
using namespace std ;
int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1} ;
char s[25][25] ;
int m,n ;
struct zhang
{
    int x,y,bu ;
} ;
int bfs(int x,int y)
{
      queue<zhang>q ;
      zhang current,next ;
      int sx,sy ;
      current.x=x ;
      current.y=y ;
      s[x][y]='*' ;
      current.bu=0 ;
      q.push(current) ;
      while(!q.empty())
         {
               current=q.front() ;
               q.pop() ;
               for(int i=0;i<4;i++)
                 {
                     next.x=current.x+dx[i] ;
                     next.y=current.y+dy[i] ;
                     if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&s[next.x][next.y]!='*')
                       {
                             next.bu=current.bu+1 ;
                             sx=next.x+dx[i] ;
                             sy=next.y+dy[i] ;
                           if(s[next.x][next.y]=='|'&&s[sx][sy]!='*')
                            {
                               if(current.bu%2&&(i==3||i==2))
                                {
                                        next.x=sx ;
                                        next.y=sy ;
                                        if(s[sx][sy]=='T')
                                             return next.bu ;
                                        s[sx][sy]='*' ;
                                        q.push(next) ;
                                }
                               else if(current.bu%2==0&&(i==0||i==1))
                                  {
                                             next.x=sx ;
                                             next.y=sy ;
                                             if(s[sx][sy]=='T')
                                                return next.bu ;
                                             s[sx][sy]='*' ;
                                             q.push(next) ;
                                  }
                                else {
                                          next.x=current.x ;
                                          next.y=current.y ;
                                          q.push(next) ;
                                     }
                            }
                           else if(s[next.x][next.y]=='-'&&s[sx][sy]!='*')
                           {
                                   if(current.bu%2==0&&(i==3||i==2))
                                   {
                                            next.x=sx ;
                                            next.y=sy ;
                                            if(s[sx][sy]=='T')
                                                  return next.bu ;
                                            s[sx][sy]='*' ;
                                            q.push(next) ;
                                   }
                               else if(current.bu%2==1&&(i==0||i==1))
                                  {
                                             next.x=sx ;
                                             next.y=sy ;
                                             if(s[sx][sy]=='T')
                                                 return next.bu ;
                                             s[sx][sy]='*' ;
                                             q.push(next) ;
                                  }
                                else {
                                          next.x=current.x ;
                                          next.y=current.y ;
                                          q.push(next) ;
                                     }
                           }
                          else if(s[next.x][next.y]=='.')
                                    {
                                        s[next.x][next.y]='*' ;
                                        q.push(next) ;
                                    }
                          else if(s[next.x][next.y]=='T')
                                    return next.bu ;
                       }
                 }
         }
    return -1 ;
}
int main()
{
    int i,j,ax,ay ;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
         {
             scanf("%s",s[i]) ;
             for(j=0;j<m;j++)
               if(s[i][j]=='S')
                  {
                      ax=i ;
                      ay=j ;
                  }
         }
        printf("%d\n",bfs(ax,ay)) ;
    }
     return 0 ;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值