hdu1180诡异的楼梯(广搜)

来源:互联网 发布:c语言做窗口按钮 编辑:程序博客网 时间:2024/06/02 08:57

题目链接: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
原创粉丝点击