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. Python:使用psycopg2模块操作PostgreSQL

    安装psycopg2模块: 怎么验证是否已经安装过psycopy2? 编写上面代码,运行看是否抛出缺少psycopg2模块. 安装方法1: 1)使用psycopg2-2.4.2.win-amd64-p ...

  2. 转:Beautiful Soup

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...

  3. 最长上升子序列(N*log(N))hdu1025

    (HDU1025) Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. 无向连通图求割边+缩点+LCA

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7082   Accepted: 2555 Descripti ...

  5. 省市联动初探AJAX操作数据

    主要学习代码: List.html <script type="text/javascript"> function GetXhr() { return new XML ...

  6. [转] JVM 调优系列 & 高并发Java系列

    1.JVM调优总结(1):一些概念:http://www.importnew.com/18694.html 2.JVM调优总结(2):基本垃圾回收算法:http://www.importnew.com ...

  7. yii框架中应用jquery表单验证插件

    效果图: 视图层: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  8. yii遍历行下的每列数据(小1月考)

    效果图: 控制器(1种): //显示列表    public function actionList()    {        //实例化对象        $model= new Qiu();   ...

  9. jquery中的json操作

    $(function() { var json = [ { "id" : "1", "tagName" : "apple" ...

  10. SQL Server session故障排查

    --根据作业名 查找session id select a.spid,a.blocked,b.name,substring(replace(a.PROGRAM_NAME,'SQLAgent - TSQ ...