Robbery
Time Limit: 1000MS   Memory Limit: 32768K
Total Submissions: 1249   Accepted: 504

Description

Inspector Robstop is very angry. Last night, a bank has been robbed and the robber has not been caught. And this happened already for the third time this year, even though he did everything in his power to stop the robber: as quickly as possible, all roads leading out of the city were blocked, making it impossible for the robber to escape. Then, the inspector asked all the people in the city to watch out for the robber, but the only messages he got were of the form "We don't see him."
But this time, he has had enough! Inspector Robstop decides to
analyze how the robber could have escaped. To do that, he asks you to
write a program which takes all the information the inspector could get
about the robber in order to find out where the robber has been at which
time.

Coincidentally, the city in which the bank was robbed has a
rectangular shape. The roads leaving the city are blocked for a certain
period of time t, and during that time, several observations of the form
"The robber isn't in the rectangle Ri at time ti" are reported.
Assuming that the robber can move at most one unit per time step, your
program must try to find the exact position of the robber at each time
step.

Input

The
input contains the description of several robberies. The first line of
each description consists of three numbers W, H, t (1 <= W,H,t <=
100) where W is the width, H the height of the city and t is the time
during which the city is locked.

The next contains a single integer n (0 <= n <= 100), the
number of messages the inspector received. The next n lines (one for
each of the messages) consist of five integers ti, Li, Ti, Ri, Bi each.
The integer ti is the time at which the observation has been made (1
<= ti <= t), and Li, Ti, Ri, Bi are the left, top, right and
bottom respectively of the (rectangular) area which has been observed.
(1 <= Li <= Ri <= W, 1 <= Ti <= Bi <= H; the point (1,
1) is the upper left hand corner, and (W, H) is the lower right hand
corner of the city.) The messages mean that the robber was not in the
given rectangle at time ti.

The input is terminated by a test case starting with W = H = t = 0. This case should not be processed.

Output

For
each robbery, first output the line "Robbery #k:", where k is the
number of the robbery. Then, there are three possibilities:

If it is impossible that the robber is still in the city considering the messages, output the line "The robber has escaped."

In all other cases, assume that the robber really is in the city.
Output one line of the form "Time step : The robber has been at x,y."
for each time step, in which the exact location can be deduced. (x and y
are the column resp. row of the robber in time step .) Output these
lines ordered by time .

If nothing can be deduced, output the line "Nothing known." and hope that the inspector will not get even more angry.

Output a blank line after each processed case.

Sample Input

4 4 5
4
1 1 1 4 3
1 1 1 3 4
4 1 1 3 4
4 4 2 4 4
10 10 3
1
2 1 1 10 10
0 0 0

Sample Output

Robbery #1:
Time step 1: The robber has been at 4,4.
Time step 2: The robber has been at 4,3.
Time step 3: The robber has been at 4,2.
Time step 4: The robber has been at 4,1. Robbery #2:
The robber has escaped.

Source

OJ-ID:
poj-1104

author:
Caution_X

date of submission:
20191024

tags:
模拟

description modelling:
给定一个矩形,现在给定四个点构成一个扫描矩形(扫描矩形在矩形内),表示该扫描矩形范围内没有盗贼,现在给出N个这样的扫描矩形,每个扫描矩形都有对应的时间,表示该扫描发生的时间,现在问能否通过N次扫描判断盗贼的状态(已逃离(离开给定的坐标范围),不确定,或者确定在点(x,y))

major steps to solve it:
vis[t][r][c]=1表示t时刻(r,c)处有盗贼
(1)按照时间正向反向搜索两次,每次扫描的目的在于判断vis[t][r][c]为0的点应不应该是1(因为扫描矩形范围内是1不代表扫描矩形外一定是0,有一些点虽然在扫描矩形外,但它依然必须是1)
(2)完成两次扫描之后遍历时间1~T状态下矩形的点,如果存在某个状态全为1,说明盗贼已经离开了矩形(已逃离),如果某个状态整个矩形只有一点是0,说明该状态下盗贼就在该点。如果所有时间的矩形都扫描过了而且没有得到盗贼的状态,输出不确定时的答案。
正向搜索方式:如果t时刻在(r,c)即vis[t][r][c]=0,那么t-1时刻必然在(r,c)周围(含(r,c))的5个点内,如果这5个点都是1,那么实际上vis[t][r][c]=1。反向搜索类似。

AC code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int vis[][][];//vis[t][r][c]=1表示第t时刻r行c列没有盗贼
int dir[][]={{,},{,},{,},{,-},{-,}};
int res[][]; //res[i][]表示第i时刻可能的位置
int W,H,T;
bool inrange(int r,int c)
{
return (r>=&&r<=H&&c>=&&c<=W);
}
void change(int r,int c,int t,int pre_t)
{
if(vis[t][r][c]) return;
for(int d=;d<;d++) {
int tmp_r=r+dir[d][];
int tmp_c=c+dir[d][];
if(inrange(tmp_r,tmp_c)&&!vis[pre_t][tmp_r][tmp_c]) return;
}
vis[t][r][c]=;
return;
}
int main()
{
//freopen("input.txt","r",stdin);
int kase=;
while(~scanf("%d%d%d",&W,&H,&T)&&W&&H&&T) {
printf("Robbery #%d:\n",kase++);
memset(vis,,sizeof(vis));
int N;
scanf("%d",&N);
while(N--) {
int Li,Ri,Ti,Bi,t;
scanf("%d%d%d%d%d",&t,&Li,&Ti,&Ri,&Bi);
for(int i=Ti;i<=Bi;i++) {
for(int j=Li;j<=Ri;j++) {
vis[t][i][j]=;
}
}
}
for(int d=;d<;d++) {
for(int i=;i<=T;i++) {
for(int r=;r<=H;r++) {
for(int c=;c<=W;c++) {
if(d==&&i!=) change(r,c,i,i-);
else change(r,c,T-i+,T-i+);
}
}
}
}
int escaped=,unknown=;
memset(res,-,sizeof(res));
for(int i=;i<=T;i++) {
bool is_allone=true;
bool is_twice_one=false;
for(int r=;r<=H;r++) {
for(int c=;c<=W;c++) {
if(!vis[i][r][c]) {
is_allone=false;
if(res[i][]==-) {
res[i][]=r;
res[i][]=c;
}
else if(res[i][]>=) {
res[i][]=-;
is_twice_one=true;
break;
}
}
}
if(is_twice_one) break;
}
if(!is_allone) escaped=;
if(res[i][]>=) unknown=;
}
if(escaped) printf("The robber has escaped.\n");
else if(unknown) printf("Nothing known.\n");
else {
for(int i=;i<=T;i++) {
if(res[i][]>=) {
printf("Time step %d: The robber has been at %d,%d.\n",i,res[i][],res[i][]);
}
}
}
printf("\n");
}
return ;
}

poj-1104 Robbery的更多相关文章

  1. POJ 3900 The Robbery

    大意:和背包的问题相似,第 i 个箱子有 i 颗钻石.钻石的重量,价值给出.然后再M的重量下背尽量多价值的钻石. 思路:直接暴搜然后剪枝.因为数据范围的原因无法用DP. #include <cs ...

  2. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  3. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  4. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  5. 搜索+剪枝 POJ 1416 Shredding Company

    POJ 1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5231   Accep ...

  6. OpenJudge 2803 碎纸机 / Poj 1416 Shredding Company

    1.链接地址: http://poj.org/problem?id=1416 http://bailian.openjudge.cn/practice/2803 2.题目: 总时间限制: 1000ms ...

  7. [POJ] 1511 Invitation Cards

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 18198   Accepted: 596 ...

  8. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  9. POJ 1416 Shredding Company【dfs入门】

    题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  10. POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 16178   Accepted: 526 ...

随机推荐

  1. -ffast-math编译选项作用

    https://stackoverflow.com/questions/7420665/what-does-gccs-ffast-math-actually-do

  2. Java技巧——比较两个日期相差的天数

    Java技巧——比较两个日期相差的天数 摘要:本文主要记录了在Java里面如何判断两个日期相差的天数. 判断两个Date类型的日期之间的天数 通过计算毫秒数判断: public static void ...

  3. DesignPattern系列__09设计模式概述

    设计模式介绍 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案, 设计模(Design pattern)代表了最佳的实践.这些解决方案是众多软 ...

  4. Tomcat安装、使用(Windows)

    一.下载.安装 1.下载 进官网下载 : https://tomcat.apache.org/ 选择自己适合的版本.在这里演示的是下载 Tomcat 7(解压安装版). 2.解压.启动tomcat 解 ...

  5. Dynamics 365中计算字段与Now进行计算实体导入报错:You can't use Now(), which is of type DateTime, with the current function.

    微软动态CRM专家罗勇 ,回复338或者20190521可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 计算字段是从Dynamics CRM 2015 SP1版本开始推 ...

  6. HTTP协议中的Range和Content-Range

    " 琢磨HTTP协议的每一个细节." HTTP协议博大精深,每一个细节都应细细体会. 否则,在协议还原的过程中,你会遇到各种问题. 今天,本文中将对HTTP协议的Range和Con ...

  7. 【转载】每个 Android 开发者必须知道的消息机制问题总结

    Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重的地位,所以弄懂它是很有必要的.下面就来说说最基本的东西. ...

  8. Ubuntu个人使用笔记整理

    Ubuntu笔记 Ubuntu使用过程中整理的一些常用或关键操作整理,以备不时之需, 另外自己可以对界面做一些美化,这部分自行百度去配置,我的界面如图 ##################Ubuntu ...

  9. MySQL数据库(三)锁机制

    MyISAM默认使用表级锁,不支持行级锁 InnoDB默认使用行级锁,也支持表级锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现 ...

  10. 查看sybase IQ的执行计划

    在性能调优工作中,首要的事情是找出性能瓶颈.而针对数据库应用,由于商用数据库对上层应用来说是个黑盒,所以往往需要借助数据库的一些接口或工具来了解数据库的具体行为,并结合相关知识和业务进行调测.    ...