首页 > 代码库 > zoj 2081 BFS 延迟标记 读入问题

zoj 2081 BFS 延迟标记 读入问题

Mission Impossible

Time Limit: 2 Seconds                                     Memory Limit: 65536 KB                            

            Now a spy is besieged in a maze. He knows that there is a telegraph transmitter  in the maze somewhere. So he must get there to use the telegraph transmitter to  ask for help. 

But the mission is very dangerous, because there are some mines in the map   (see the figure above). When the spy steps on it, it will immediately explode   and the mission will fail. The spy doesn‘t know where the mines are, thus he   will use his best strategy to get to the destination (he will always go along   the shortest path). There may be several shortest paths for the spy to choose,   and the probability to choose each path from the start point to the destination   is the same.

Now your task is to write a program to find the probability that the spy can   get to the telegraph transmitter.

Input

The input file begins with an integer T, indicating the number of test cases.   Each test case begins with two integers N, M, indicating the height and width   of the maze. (N <= 10, M <= 10) In the following N lines, each line contains   M characters describing the map. There is one blank line after each map. Spaces   denotes empty square, ‘#‘ denotes a wall, ‘S‘ denotes the spy, ‘M‘ denotes a   mine, and ‘T‘ denotes the telegraph transmitter. It‘s guaranteed that the four   sides of the map are all walls.

  Output

For each maze, first output the number of the test case (`Mission #1:‘, ` Mission   #2:‘, etc.) in a line of its own.

If it is possible for the spy to get to the telegraph transmitter, print a   line containing the probability that the spy can get to the telegraph transmitter,   exact to two digit to the right of the decimal point. Adhere to the output format   shown in the sample below.

If the spy can‘t get to the destination, output a line containing the statement   `Mission Impossible.‘
  Output a blank line after each test case.

Sample Input

2   6 10   ##########   # M   T  #   #  ###   #   #  ###   #   # S      #   ##########

6 10   ##########   # M  T   #   #  ###   #   #  ###   #   # S      #   ##########

 

Sample Output

Mission #1:   The probability for the spy to get to the telegraph transmitter is 50.00%.

Mission #2:   Mission Impossible.

 


                            Author: YE, Kai                                         Source: ZOJ Monthly, February 2004

 

题意:间谍只走最短路,而这些路上可能埋有炸弹,请问间谍安全到达目的地的可能性多少。

题解:BFS记录最短路径个数以及这些路径中踩到炸弹的路径的个数,最后换算个百分比就行了。

注意需要延迟标记,还有图中有空格,读入不能用scanf。

 

  1 #include<iostream>  2 #include<cstring>  3 #include<cstdlib>  4 #include<cstdio>  5 #include<algorithm>  6 #include<cmath>  7 #include<queue>  8 #include<map>  9  10 #define N 101 11 #define M 15 12 #define mod 1000000007 13 #define mod2 100000000 14 #define ll long long 15 #define maxi(a,b) (a)>(b)? (a) : (b) 16 #define mini(a,b) (a)<(b)? (a) : (b) 17  18 using namespace std; 19  20 int T; 21 char s[N][N]; 22 int vis[N][N]; 23 int cc,tot; 24 int n,m; 25 int dirx[]={1,-1,0,0}; 26 int diry[]={0,0,1,-1}; 27  28 typedef struct 29 { 30     int x; 31     int y; 32     int now; 33     int boom; 34 }PP; 35  36 PP start,end; 37  38 int ok(PP next) 39 { 40     if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && vis[next.x][next.y]==0 && s[next.x][next.y]!=#){ 41         if(s[next.x][next.y]==M) 42             next.boom=1; 43         return next.boom; 44     } 45     return 0; 46 } 47  48 void BFS() 49 { 50     queue<PP> q; 51     q.push(start); 52     int first=-1; 53     PP te,next; 54     int i; 55     int re; 56     while(q.size()!=0) 57     { 58         te=q.front(); 59         vis[te.x][te.y]=1; 60         q.pop(); 61        // printf(" %d %d\n",te.x,te.y); 62         for(i=0;i<4;i++){ 63             next.x=te.x+dirx[i]; 64             next.y=te.y+diry[i]; 65             next.now=te.now+1; 66             next.boom=te.boom; 67             re=ok(next); 68             next.boom=re; 69             if(re==0) continue; 70             if(next.x==end.x && next.y==end.y) 71             { 72               //  printf(" %d %d first=%d now=%d %d\n",next.x,next.y,first,next.now,next.boom); 73                 if(first==-1) first=next.now; 74                 else{ 75                     if(next.now!=first) return; 76                 } 77                 tot++; 78                 if(next.boom==2) cc++; 79             } 80             else{ 81                 q.push(next); 82             } 83         } 84     } 85 } 86  87 int main() 88 { 89     int i,j; 90     //freopen("data.in","r",stdin); 91     scanf("%d",&T); 92     getchar(); 93     for(int cnt=1;cnt<=T;cnt++) 94     //while(T--) 95     //while(scanf("%d%d",&n,&q)!=EOF) 96     { 97         //q.clear(); 98         cc=tot=0; 99         memset(vis,0,sizeof(vis));100         scanf("%d%d",&n,&m);101         getchar();102         for(i=0;i<n;i++){103             gets(s[i]);104         }105         for(i=0;i<n;i++){106             for(j=0;j<m;j++){107                 if(s[i][j]==S){108                     start.x=i;109                     start.y=j;110                     start.boom=2;111                     start.now=0;112                 }113                 if(s[i][j]==T){114                     end.x=i;115                     end.y=j;116                 }117             }118         }119         //printf("%d %d %d %d\n",start.x,start.y,end.x,end.y);120         BFS();121         printf("Mission #%d:\n",cnt);122         if(cc==0){123             printf("Mission Impossible.\n");124         }125         else{126             printf("The probability for the spy to get to the telegraph transmitter is %.2f%%.\n",(1.0)*100*cc/tot);127         }128          printf("\n");129 130     }131 132     return 0;133 }