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 }
posted @ 2012-11-18 15:19  zerojetlag  阅读(1291)  评论(0编辑  收藏  举报