hdu 1180诡异的楼梯

bfs,又是一次血淋淋的教训,忽略了楼梯跳回起点的情况,wa了好几次,以后醒目了,标记步数的地图起点表为1,到后面步数-1就好了。

这题是在普通bfs的基础上加了一点变化,在遇到楼梯的时候,用步数的奇偶性判断能不能过,如果能过,就看过了楼梯之后的那一格是否被访问过,如果没有就访问;如果楼梯不能过,把当前所在的位置步数+1放到队列尾(因此判断楼梯要在判断'.'后面,因为这样才能保证其他方向的步数正确性,+1后放队列尾,出队时方向就只剩楼梯方向了,这时候楼梯也通了)

  1 #include <stdio.h>
  2 #include<string.h>
  3 char map[22][22];
  4 int mark[22][22];
  5 int n,m;
  6 int sx,sy,tx,ty;
  7 int q[10000];
  8 int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
  9 
 10 void bfs()
 11 {
 12     int u,front=0,rear=0;
 13     u=sx*m+sy;
 14     q[rear++]=u;
 15     mark[sx][sy]=1;
 16     while (front<rear)
 17     {
 18         u=q[front++];
 19         int x=u/m;
 20         int y=u%m;
 21         if(map[x][y]=='T')
 22             return;
 23         for(int i=0;i<4;i++)
 24         {
 25             int xx=x+dir[i][0];
 26             int yy=y+dir[i][1];
 27             if(xx>=0&&xx<n&&yy>=0&&yy<m&&mark[xx][yy]==0)
 28             {
 29                 if(map[xx][yy]=='.')
 30                 {
 31                     mark[xx][yy]=mark[x][y]+1;
 32                     q[rear++]=xx*m+yy;
 33                 }
 34                 else if(map[xx][yy]=='T')
 35                 {
 36                     mark[xx][yy]=mark[x][y]+1;
 37                     return;
 38                 }
 39                 else if(map[xx][yy]=='|')
 40                 {
 41                     int xxx=xx+dir[i][0];
 42                     int yyy=yy+dir[i][1];
 43                     if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&map[xxx][yyy]!='*'&&mark[xxx][yyy]==0)
 44                     {
 45                         if(i<2&&mark[x][y]%2==1||(i>1&&mark[x][y]%2==0))
 46                         {
 47                             mark[xxx][yyy]=mark[x][y]+1;
 48                             q[rear++]=xxx*m+yyy;
 49                         }
 50                         else
 51                         {
 52                             mark[x][y]+=1;
 53                             q[rear++]=x*m+y;
 54                         }
 55                     }
 56                 }
 57                 else if(map[xx][yy]=='-')
 58                 {
 59                     int xxx=xx+dir[i][0];
 60                     int yyy=yy+dir[i][1];
 61                     if(xxx>=0&&xxx<n&&yyy>=0&&yyy<m&&map[xxx][yyy]!='*'&&mark[xxx][yyy]==0)
 62                     {
 63                         if(i>1&&mark[x][y]%2==1||(i<2&&mark[x][y]%2==0))
 64                         {
 65                             mark[xxx][yyy]=mark[x][y]+1;
 66                             q[rear++]=xxx*m+yyy;
 67                         }
 68                         else
 69                         {
 70                             mark[x][y]+=1;
 71                             q[rear++]=x*m+y;
 72                         }
 73                     }
 74                 }
 75             }
 76         }
 77     }
 78 }
 79 
 80 int main(int argc, char *argv[])
 81 {
 82     while (scanf("%d %d",&n,&m)!=EOF)
 83     {
 84         int i,j;
 85         //printf("%d %d\n",n,m);
 86         for (i=0;i<n;i++)
 87         {
 88             scanf("%s",map[i]);
 89             for(j=0;j<m;j++)
 90             {
 91                 if(map[i][j]=='S')
 92                 {sx=i;sy=j;}
 93                 if(map[i][j]=='T')
 94                 {tx=i;ty=j;}
 95             }
 96         }//printf("%d %d\n",n,m);
 97         for(i=0;i<n;i++)
 98             for(j=0;j<m;j++)
 99                 mark[i][j]=0;
100         bfs();
101         
102         /*for(i=0;i<n;i++)
103         {
104             for(j=0;j<m;j++)
105                 printf("%d",mark[i][j]);
106             printf("\n");
107         }*/
108         printf("%d\n",mark[tx][ty]-1);
109 
110     }
111     return 0;
112 }

转载于:https://www.cnblogs.com/zerojetlag/archive/2012/11/18/2775913.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值