hdu1180诡异的楼梯(广搜)

题目链接:click here~

题目解析:对于楼梯来说,不进行 标记,当到达楼梯时,如果可以走并且跨过楼梯之后的点也可以走,那么就走楼梯,否则的话,就等一分钟,即当前节点的时间加1然后 加入队列,其他的就跟一本的搜索一样了。

代码如下;

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
    int x;
    int y;
    int time;
};
char map[23][23];
int vis[23][23];
int m,n,a,b;
int dx[5]={1,-1,0,0};
int dy[5]={0,0,1,-1};
void bfs()
{
    memset(vis,0,sizeof(vis));
    node node1,node2;
    queue<node>q;
    node1.x=a;
    node1.y=b;
    node1.time=0;
    q.push(node1);
    vis[node1.x][node1.y]=1;
    while(!q.empty())
    {
        node2=q.front();
       // printf("%d %d %d--->\n",node2.x,node2.y,node2.time);
        q.pop();
        if(map[node2.x][node2.y]=='T')
        {
            printf("%d\n",node2.time);
            return;
        }
        for(int i=0;i<4;i++)
        {
            node1.x=node2.x+dx[i];
            node1.y=node2.y+dy[i];
            if((map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y])
            {
                node1.time=node2.time+1;
                q.push(node1);
                vis[node1.x][node1.y]=1;
            }
            if(map[node1.x][node1.y]=='*')  continue;
            if(map[node1.x][node1.y]=='-')
            {
                if(node2.time%2==0)               //也就是说楼梯当前的状态任然是'-'
                {
                    if(node1.x==node2.x)                //横坐标相同,说明此时可以从楼梯过
                    {
                        node1.y=node1.y*2-node2.y;                    //从楼梯过去之后纵坐标要发生变化
                        if(node1.y>=1&&node1.y<=n&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y])
                        node1.time=node2.time+1;
                        q.push(node1);
                        vis[node1.x][node1.y]=1;
                    }
                    else                                 //说明此时不可以从楼梯过,要等待1分钟
                    {
                        node1.time=node2.time+1;
                        node1.x=node2.x;
                        node1.y=node2.y;
                        q.push(node1);
                        vis[node1.x][node1.y]=1;
                    }
                }
                else                                  //说明此时的状态时'|'
                {
                    if(node1.y==node2.y)                 //纵坐标相同,说明此时可以从楼梯过
                    {
                        node1.x=node1.x*2-node2.x;
                        if(node1.x>=1&&node1.x<=m&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y])
                        {
                            node1.time=node2.time+1;
                            q.push(node1);
                            vis[node1.x][node1.y]=1;
                        }
                    }
                    else
                    {
                        node1.x=node2.x;
                        node1.y=node2.y;
                        node1.time=node2.time+1;
                        q.push(node1);
                        vis[node1.x][node1.y]=1;
                    }

                }
            }
            if(map[node1.x][node1.y]=='|')
            {
                if(node2.time%2==0)             //说明此时的状态任然是'|'
                {
                    if(node1.y==node2.y)           //如果纵坐标相同说明此时可以从楼梯过
                    {
                        node1.x=node1.x*2-node2.x;
                        if(node1.x>=1&&node1.x<=m&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y])
                        {
                            node1.time=node2.time+1;
                            q.push(node1);
                            vis[node1.x][node1.y]=1;
                        }
                    }
                    else
                    {
                        node1.x=node2.x;
                        node1.y=node2.y;
                        node1.time=node2.time+1;
                        q.push(node1);
                        vis[node1.x][node1.y]=1;
                    }

                }
                else                            //说明此时的状态是'-'
                {
                    if(node1.x==node2.x)         //横坐标相同,说明此时可以从楼梯过
                    {
                        node1.y=node1.y*2-node2.y;
                        if(node1.y>=1&&node1.y<=n&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y])
                        {
                            node1.time=node2.time+1;
                            q.push(node1);
                            vis[node1.x][node1.y]=1;
                        }
                    }
                    else                                        //横坐标不相同,说明此时需要等待1分钟
                    {
                        node1.x=node2.x;
                        node1.y=node2.y;
                        node1.time=node2.time+1;
                        q.push(node1);
                        vis[node1.x][node1.y]=1;
                    }
                }

            }

        }

    }

}
int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(int i=1;i<=m;i++)
        {
          getchar();
          for(int j=1;j<=n;j++)
          {
              scanf("%c",&map[i][j]);
              if(map[i][j]=='S')
              {
                  a=i;
                  b=j;
              }
          }
        }
        bfs();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值