zoj 2081 BFS 延迟标记 读入问题
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 延迟标记 读入问题的更多相关文章
- codevs 1082 线段树练习 3 区间更新+延迟标记
题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...
- HDU5785 Interesting(Manacher + 延迟标记)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5785 Description Alice get a string S. She think ...
- FZU 2171(线段树的延迟标记)
题意:容易理解. 分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞, 然后我就一直没去碰线段树的题了 ...
- [HDOJ4578]Transformation(线段树,多延迟标记)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 四种操作:查询.加法.乘法.改数.应该是需要维护三个lazy标记,然后就是套路了.查询是区间内所 ...
- 杭电 HDU ACM 1698 Just a Hook(线段树 区间更新 延迟标记)
欢迎"热爱编程"的高考少年--报考杭州电子科技大学计算机学院 Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memor ...
- [uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)
题目链接:https://vjudge.net/problem/UVA-11992 题意:n*m的矩阵,每次对一个子矩阵操作,有三种操作:加x,设置为x,查询.查询返回子矩阵和.最小值.最大值 n很小 ...
- Tree(树链剖分+线段树延迟标记)
Tree http://poj.org/problem?id=3237 Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12 ...
- 【左偏树+延迟标记+拓扑排序】BZOJ4003-城池攻占
[题目大意] 有n个城市构成一棵树,除1号城市外每个城市均有防御值h和战斗变化参量a和v. 现在有m个骑士各自来刷副本,每个其实有一个战斗力s和起始位置c.如果一个骑士的战斗力s大于当前城市的防御值h ...
- Codeforces Round #262 (Div. 2)C(二分答案,延迟标记)
这是最大化最小值的一类问题,这类问题通常用二分法枚举答案就行了. 二分答案时,先确定答案肯定在哪个区间内.然后二分判断,关键在于怎么判断每次枚举的这个答案行不行. 我是用a[i]数组表示初始时花的高度 ...
随机推荐
- Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)
算一下复杂度.发现可以直接暴.对于u枚举a和b,判断一下是否连边,更新答案. #include<bits/stdc++.h> using namespace std; int n,m; ; ...
- spark简单入门
本文由cmd markdown编辑,原始链接:https://www.zybuluo.com/jewes/note/35032 RDD是什么? RDD是Spark中的抽象数据结构类型,任何数据在Spa ...
- KTU Programming Camp (Winter Training Day 1)
A.B.C(By musashiheart) 0216个人赛前三道题解 E(By ggg) Gym - 100735E Restore H(by pipixia) Gym - 100735H
- Mysql闪回工具之binlog2sql的原理及其使用
生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成 ...
- win10 多桌面 win+tab | ctrl+win+左右箭头
win10 多桌面 win+tab | ctrl+win+左右箭头
- 获取显示设备的名称及PNPDeviceID
实现效果: 知识运用: ManagementObjectSearcher类和ManagementObject类 实现代码: private void button1_Click(object send ...
- kmp 模板
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> ...
- C++ C++ 值传递、指针传递、引用传递详解
这一篇博客写的不错: https://www.cnblogs.com/dingxiaoqiang/p/8012578.html
- VIM C语言函数名高亮
VIM默认情况下,函数名是不会高亮的,将下面这段代码添加到/usr/share/vim/vim73/syntax/c.vim文件的末尾即可: "highlight Functions s ...
- Bootstrap历练实例:导航内下拉菜单的用法
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...