Crashing Robots
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8340   Accepted: 3607

Description

In a modernized warehouse, robots are used to fetch the goods. Careful planning is needed to ensure that the robots reach their destinations without crashing into each other. Of course, all warehouses are rectangular, and all robots
occupy a circular floor space with a diameter of 1 meter. Assume there are N robots, numbered from 1 through N. You will get to know the position and orientation of each robot, and all the instructions, which are carefully (and mindlessly) followed by the
robots. Instructions are processed in the order they come. No two robots move simultaneously; a robot always completes its move before the next one starts moving.

A robot crashes with a wall if it attempts to move outside the area of the warehouse, and two robots crash with each other if they ever try to occupy the same spot.

Input

The first line of input is K, the number of test cases. Each test case starts with one line consisting of two integers, 1 <= A, B <= 100, giving the size of the warehouse in meters. A is the length in the EW-direction, and B in
the NS-direction.

The second line contains two integers, 1 <= N, M <= 100, denoting the numbers of robots and instructions respectively.

Then follow N lines with two integers, 1 <= Xi <= A, 1 <= Yi <= B and one letter (N, S, E or W), giving the starting position and direction of each robot, in order from 1 through N. No two robots start at the same position.



Figure 1: The starting positions of the robots in the sample warehouse


Finally there are M lines, giving the instructions in sequential order.

An instruction has the following format:

< robot #> < action> < repeat>

Where is one of

  • L: turn left 90 degrees,
  • R: turn right 90 degrees, or
  • F: move forward one meter,

and 1 <= < repeat> <= 100 is the number of times the robot should perform this single move.

Output

Output one line for each test case:

  • Robot i crashes into the wall, if robot i crashes into a wall. (A robot crashes into a wall if Xi = 0, Xi = A + 1, Yi = 0 or Yi = B + 1.)
  • Robot i crashes into robot j, if robots i and j crash, and i is the moving robot.
  • OK, if no crashing occurs.

Only the first crash is to be reported.

Sample Input

4
5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7
5 4
2 4
1 1 E
5 4 W
1 F 3
2 F 1
1 L 1
1 F 3
5 4
2 2
1 1 E
5 4 W
1 L 96
1 F 2
5 4
2 3
1 1 E
5 4 W
1 F 4
1 L 1
1 F 20

Sample Output

Robot 1 crashes into the wall
Robot 1 crashes into robot 2
OK
Robot 1 crashes into robot 2
模拟题
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std; const int Max=1100000; struct node
{
int dir;
int x;
int y;
} Robot[110]; struct INS
{
int num;
int action;
int repeat;
} Order[110]; bool Map[110][110]; int Dir[4][2]= {{1,0},{0,-1},{-1,0},{0,1}}; int A,B; int n,m; int Handle(int s)
{
if(s=='S'||s=='R')
{
return 1;
}
if(s=='N')
{
return 3;
}
if(s=='E'||s=='F')
{
return 0;
}
if(s=='W')
{
return 2;
}
if(s=='L')
return -1;
return 0;
}
bool Mon()
{
for(int i=0; i<m; i++)
{
if(Order[i].action==1)
{
while(Order[i].repeat--)
{
Robot[Order[i].num].dir++;
if(Robot[Order[i].num].dir==4)
{
Robot[Order[i].num].dir=0;
}
}
}
else if(Order[i].action==-1)
{
while(Order[i].repeat--)
{
Robot[Order[i].num].dir--;
if(Robot[Order[i].num].dir==-1)
{
Robot[Order[i].num].dir=3;
}
}
}
else if(Order[i].action==0)
{
while(Order[i].repeat--)
{
Map[Robot[Order[i].num].x][Robot[Order[i].num].y]=false;
Robot[Order[i].num].x+=Dir[Robot[Order[i].num].dir][0];
Robot[Order[i].num].y+=Dir[Robot[Order[i].num].dir][1];
if(Robot[Order[i].num].x==0||Robot[Order[i].num].x==A+1||Robot[Order[i].num].y==0||Robot[Order[i].num].y==B+1)
{
printf("Robot %d crashes into the wall\n",Order[i].num);
return false;
}
else if(Map[Robot[Order[i].num].x][Robot[Order[i].num].y])
{
for(int j=1; j<=n; j++)
{
if(j!=Order[i].num&&Robot[j].x==Robot[Order[i].num].x&&Robot[j].y==Robot[Order[i].num].y)
{
printf("Robot %d crashes into robot %d\n",Order[i].num,j);
return false;
}
}
}
else
{
Map[Robot[Order[i].num].x][Robot[Order[i].num].y]=true;
}
} }
}
return true;
}
int main()
{
int T;
char s;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&A,&B);
scanf("%d %d",&n,&m);
memset(Map,false,sizeof(Map));
for(int i=1; i<=n; i++)
{
scanf("%d %d %c",&Robot[i].x,&Robot[i].y,&s);
Map[Robot[i].x][Robot[i].y]=true;
Robot[i].dir=Handle(s);
}
for(int i=0; i<m; i++)
{
scanf("%d %c %d",&Order[i].num,&s,&Order[i].repeat);
Order[i].action=Handle(s);
}
if(Mon())
{
printf("OK\n");
}
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Crashing Robots 分类: POJ 2015-06-29 11:44 10人阅读 评论(0) 收藏的更多相关文章

  1. 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏

    在百度编辑器示例代码基础上进行了修改,封装成类库,只需简单配置即可使用. 完整demo下载 版权声明:本文为博主原创文章,未经博主允许不得转载.

  2. Train Problem I 分类: HDU 2015-06-26 11:27 10人阅读 评论(0) 收藏

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. Least Common Ancestors 分类: ACM TYPE 2014-10-19 11:24 84人阅读 评论(0) 收藏

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  4. 二分图匹配(KM算法)n^4 分类: ACM TYPE 2014-10-04 11:36 88人阅读 评论(0) 收藏

    #include <iostream> #include<cstring> #include<cstdio> #include<cmath> #incl ...

  5. Segment Tree with Lazy 分类: ACM TYPE 2014-08-29 11:28 134人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; stru ...

  6. 8大排序算法图文讲解 分类: Brush Mode 2014-08-18 11:49 78人阅读 评论(0) 收藏

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...

  7. C语言之void类型及void指针 分类: C/C++ 2015-07-13 11:24 8人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/pengyingh/articles/2407267.html 1.概述 许多初学者对C/C 语言中的void及void指针类型不甚理解,因此在 ...

  8. 指向函数的指针 分类: C/C++ 2015-07-13 11:03 14人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/zxl2431/archive/2011/03/25/1995285.html 讲的很清楚,备份记录. (一) 用函数指针变量调用函数 可以用指 ...

  9. iOS调用相机,相册,上传头像 分类: ios技术 2015-04-14 11:23 256人阅读 评论(0) 收藏

    一.新建工程 二.拖控件,创建映射 三.在.h中加入delegate @interface ViewController : UIViewController 复制代码 四.实现按钮事件 -(IBAc ...

随机推荐

  1. jQuery uploadify上传文件404,500错误

    1.如果部署到了IIS7的话,IIS7默认的大小为3000000.修改方法如下: 找到网站双击“请求筛选”——右边找到“编辑功能设置”——将“允许的最大内容长度”改成你想要的就行了. 2.当上传大文件 ...

  2. .pch头文件的添加

    在工程中找Building Settings --> language -->prefix Header -->填写.pch的路径

  3. SQL top查询

    select *from emp;

  4. TPageControl组件

    TPageControl的功能是创建多个Dialog页,而这些重叠的每一个页Dialog就是通过TTabSheet对象实现的

  5. Android Studio更新升级方法(转)

    自从2013 Google I/O大会之后,笔者就将android ide开发工具从eclipse迁移到Android Studio了,android studio一直在更新完善,为了与时俱进,我们当 ...

  6. 什么是XML

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  7. 关于header跳转之后的乱码问题

    关于header跳转之后的乱码问题 http://www.360doc.com/content/11/0603/19/7052474_121495648.shtml 问题:不同网站的跳转出现乱码,不同 ...

  8. Oracle重置序列(不删除重建方式)

    Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译. 不过还有种巧妙的方式,不用删除,利用步长参数,先查出seque ...

  9. oracle的系统文件的查询

    1:查看实例和数据库的相关信息 --查看实例 select instance_name,version,status,archiver,database_status from v$instance; ...

  10. Limit the query running time with Resource limit facility (RLF)

    If you need to limit the query(package,plan) running time, but the JCL/JOB TIME parameters doesn't w ...