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 }