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。

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map> #define N 101
#define M 15
#define mod 1000000007
#define mod2 100000000
#define ll long long
#define maxi(a,b) (a)>(b)? (a) : (b)
#define mini(a,b) (a)<(b)? (a) : (b) using namespace std; int T;
char s[N][N];
int vis[N][N];
int cc,tot;
int n,m;
int dirx[]={,-,,};
int diry[]={,,,-}; typedef struct
{
int x;
int y;
int now;
int boom;
}PP; PP start,end; int ok(PP next)
{
if(next.x>= && next.x<n && next.y>= && next.y<m && vis[next.x][next.y]== && s[next.x][next.y]!='#'){
if(s[next.x][next.y]=='M')
next.boom=;
return next.boom;
}
return ;
} void BFS()
{
queue<PP> q;
q.push(start);
int first=-;
PP te,next;
int i;
int re;
while(q.size()!=)
{
te=q.front();
vis[te.x][te.y]=;
q.pop();
// printf(" %d %d\n",te.x,te.y);
for(i=;i<;i++){
next.x=te.x+dirx[i];
next.y=te.y+diry[i];
next.now=te.now+;
next.boom=te.boom;
re=ok(next);
next.boom=re;
if(re==) continue;
if(next.x==end.x && next.y==end.y)
{
// printf(" %d %d first=%d now=%d %d\n",next.x,next.y,first,next.now,next.boom);
if(first==-) first=next.now;
else{
if(next.now!=first) return;
}
tot++;
if(next.boom==) cc++;
}
else{
q.push(next);
}
}
}
} int main()
{
int i,j;
//freopen("data.in","r",stdin);
scanf("%d",&T);
getchar();
for(int cnt=;cnt<=T;cnt++)
//while(T--)
//while(scanf("%d%d",&n,&q)!=EOF)
{
//q.clear();
cc=tot=;
memset(vis,,sizeof(vis));
scanf("%d%d",&n,&m);
getchar();
for(i=;i<n;i++){
gets(s[i]);
}
for(i=;i<n;i++){
for(j=;j<m;j++){
if(s[i][j]=='S'){
start.x=i;
start.y=j;
start.boom=;
start.now=;
}
if(s[i][j]=='T'){
end.x=i;
end.y=j;
}
}
}
//printf("%d %d %d %d\n",start.x,start.y,end.x,end.y);
BFS();
printf("Mission #%d:\n",cnt);
if(cc==){
printf("Mission Impossible.\n");
}
else{
printf("The probability for the spy to get to the telegraph transmitter is %.2f%%.\n",(1.0)**cc/tot);
}
printf("\n"); } return ;
}

zoj 2081 BFS 延迟标记 读入问题的更多相关文章

  1. codevs 1082 线段树练习 3 区间更新+延迟标记

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  2. HDU5785 Interesting(Manacher + 延迟标记)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5785 Description Alice get a string S. She think ...

  3. FZU 2171(线段树的延迟标记)

    题意:容易理解. 分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞, 然后我就一直没去碰线段树的题了 ...

  4. [HDOJ4578]Transformation(线段树,多延迟标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 四种操作:查询.加法.乘法.改数.应该是需要维护三个lazy标记,然后就是套路了.查询是区间内所 ...

  5. 杭电 HDU ACM 1698 Just a Hook(线段树 区间更新 延迟标记)

    欢迎"热爱编程"的高考少年--报考杭州电子科技大学计算机学院 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memor ...

  6. [uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)

    题目链接:https://vjudge.net/problem/UVA-11992 题意:n*m的矩阵,每次对一个子矩阵操作,有三种操作:加x,设置为x,查询.查询返回子矩阵和.最小值.最大值 n很小 ...

  7. Tree(树链剖分+线段树延迟标记)

    Tree http://poj.org/problem?id=3237 Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12 ...

  8. 【左偏树+延迟标记+拓扑排序】BZOJ4003-城池攻占

    [题目大意] 有n个城市构成一棵树,除1号城市外每个城市均有防御值h和战斗变化参量a和v. 现在有m个骑士各自来刷副本,每个其实有一个战斗力s和起始位置c.如果一个骑士的战斗力s大于当前城市的防御值h ...

  9. Codeforces Round #262 (Div. 2)C(二分答案,延迟标记)

    这是最大化最小值的一类问题,这类问题通常用二分法枚举答案就行了. 二分答案时,先确定答案肯定在哪个区间内.然后二分判断,关键在于怎么判断每次枚举的这个答案行不行. 我是用a[i]数组表示初始时花的高度 ...

随机推荐

  1. XDU——受教了

    存在的问题还是很多的 GG 突然觉得刷题的目的并不是追求A.我们应该在那个过程中提高代码能力和建立模型解题能力 会的算法会巧妙应用才是王道 吐槽自己两句,写高数了

  2. 在web应用中使用日志

    Log4J是Jakarta下的一个开源代码的子项目,用Log4J,我们可以使用定制的格式,把调试信息和日志信息输出到一个或多个需要的地方. 在Web应用中一般使用一个专门的Servlet来完成Log4 ...

  3. css--float浮动

    前戏 前面我们学习了CSS相关的知识,现在试想一下,如果我们想把两个div放在一行显示,该怎么处理?前面也说过,div是块级标签,默认占一行,这时候如果想要达成效果,那就要用到float了 float ...

  4. HTML5服务器发送事件(Server-Send Events)

    HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送 ...

  5. 带图形桌面的CentOS7----中安装VMWareTools以及支持中文输入

    主机是WIN10操作系统 安装VMWareTools的方法:https://jingyan.baidu.com/article/e8cdb32b136ad637052bad26.html 在图形化Ce ...

  6. POJ-3669-流星雨

    这题的话,卡了有两个小时左右,首先更新地图的时候越界了,我们进行更新的时候,要判断一下是不是小于零了,越界就会Runtime Error. 然后bfs 的时候,我没有允许它搜出300以外的范围,然后就 ...

  7. windows 下phpstudy 升级mysql版本5.7

    今天在导入sql文件的时候遇到了sql执行错误.最后找到原因是因为mysql版本过低,导致出错 原因:在执行sql的时候出现了两次CURRENT_TIMESTAMP ,最后得知在5.7版本之前都是不支 ...

  8. Pycharm快捷键及Python常用转义符

    不管是windows.xshell或者pycharm,学会使用快捷键都会使学习工作达到事半功倍的效果.这篇博客收集了部分常用的pycharm快捷键,分享给大家,希望对大家有用. 1. 常用快捷键 Py ...

  9. 【php】 给数组重建索引

    array_values $a = [1,2]; unset($a[1]); $a[] = 3; print_r($a); // 输出 [0=>1,2=>3]

  10. Django初学及mvt模型理解

    Django是python语言用来做web项目的一个模板,创建Django项目之后会自动生成models,views和templates文件夹,又叫mvt框架 文件结构如下: Models:其中mod ...