模拟 --- Crashing Robots
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 7394 | Accepted: 3242 |
Description
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
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
- 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
【题目来源】
http://poj.org/problem?id=2632
【题目大意】
poj 2632
在一个大型仓库里,机器人常常需要来往取货。需要一系列的指令来操作机器人使得每个机器人移动到他的目的地。并且不能撞到其他的机器人。当然,所有的仓库都是矩形的,每个的机器人占据一个半径为1的圆形。
假定有N个机器人,编号为1到N。你将会知道每个机器人的位置和方向,并且所有下达的指令,机器人将会听从这些指令。指令出来后将会被处理。
没有两个机器人将会同时移动,每个机器人移动完后下一个机器人才会移动。
一个机器人撞到墙壁的话,他将会被撞毁;如果两个机器人相撞的话,两个机器人都将会被撞毁。
输入:
第一行是一个整数K,表示测试情况有K个。
每个测试情况的第一行是两个整数,1<=A,B<=100,表示这个仓库的大小。A表示横向的长度,B表示纵向的长度。
第二行有两个数,1<=N,M<=100,分别表示机器人的数量和指令数目。
接下来有N行,每行有两个数字和一个字母(N,S,E,W),表示每一个机器人的坐标和方向。没有相同的两个机器人在相同的位置上。
最后是M行,代表一连串的指令。
每个指令的格式如下:
<哪个机器人><要执行的动作><重复的次数>
其中动作包括:
L:向左转90度
R:向右转90度
F:向前走
每次重复的次数大于等于1小于等于10。
输出:
每个test case输出1行。
输出包括:
如果机器人i撞到了墙壁,那么输出:Robot i crashes into the wall
如果机器人i撞到了机器人j,那么输出:Robot i crashes into robot j
如果没有机器人相撞,那么输出:OK
只需要报告第一次撞击。
【题目分析】
比较简单的长模拟,就是代码长,估计是被我写残了,写了250多行。做的时候要注意细节,比如说这题的地图的y轴和数组是反的,做的时候要反过来,还有横纵坐标也是反的。注意了这些细节就可以ac了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define MAX 150
using namespace std;
struct Node
{
bool have;
int dir;
int number;
}; Node Map[MAX][MAX];
int A,B; struct Order
{
int num;
char op;
int time;
};
Order order[MAX]; void make_Map(int n,int m)
{
int i,j;
for(i=;i<=n+;i++)
{
for(j=;j<=m+;j++)
{
Map[i][j].have=false;
Map[i][j].dir=;
Map[i][j].number=;
}
}
//将地图围起来,这里可以使用dir这个值来标记围墙
for(i=;i<=n+;i++)
Map[i][].dir=Map[i][m+].dir=-;
for(i=;i<=m+;i++)
Map[][i].dir=Map[n+][i].dir=-;
// for(i=0;i<=n+1;i++)
// {
// for(j=0;j<=m+1;j++)
// {
// printf("%d ",Map[i][j].dir);
// }
// puts("");
// }
} bool go(int num,char op,int time)
{
// printf("num=%d op=%c time=%d\n",num,op,time);
int i,j;
int x1,y1;
int number1,dir1;
// for(i=1;i<=B;i++)
// {
// for(j=1;j<=A;j++)
// {
// printf("%d ",Map[i][j].number);
// }
// puts("");
// }
for(i=;i<=B;i++)
{
for(j=;j<=A;j++)
{
if(Map[i][j].number==num)
{
x1=i;
y1=j;
break;
}
}
}
// printf("x1=%d y1=%d\n",x1,y1);
if(op=='L') //右转90度
{
for(i=;i<=time;i++)
{
Map[x1][y1].dir=(Map[x1][y1].dir+)%;
}
}
else if(op=='R') //左转90度
{
for(i=;i<time;i++)
{
Map[x1][y1].dir=(Map[x1][y1].dir-);
if(Map[x1][y1].dir==)
Map[x1][y1].dir=;
}
}
else //前进
{
// printf("x1=%d y1=%d\n",x1,y1);
// printf("Map[%d][%d].dir=%d\n",x1,y1,Map[x1][y1].dir);
switch(Map[x1][y1].dir)
{
case : //往上走
number1=Map[x1][y1].number;
dir1=Map[x1][y1].dir;
Map[x1][y1].number=;
Map[x1][y1].have=!Map[x1][y1].have;
// printf("This is case 1\n");
for(i=;i<time;i++)
{
x1--;
if(Map[x1][y1].have) //遇到了其他机器人
{
printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number);
return true;
}
if(Map[x1][y1].dir==-)//撞到了墙
{
printf("Robot %d crashes into the wall\n",number1);
return true;
}
}
Map[x1][y1].have=true;
Map[x1][y1].dir=dir1;
Map[x1][y1].number=number1;
break;
case : //往右走
number1=Map[x1][y1].number;
dir1=Map[x1][y1].dir;
Map[x1][y1].number=;
Map[x1][y1].have=!Map[x1][y1].have;
// printf("This is case 2\n");
for(i=;i<time;i++)
{
y1++;
if(Map[x1][y1].have) //遇到了其他机器人
{
printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number);
return true;
}
if(Map[x1][y1].dir==-)//撞到了墙
{
printf("Robot %d crashes into the wall\n",number1);
return true;
}
}
Map[x1][y1].have=true;
Map[x1][y1].dir=dir1;
Map[x1][y1].number=number1;
break;
case ://往下走
number1=Map[x1][y1].number;
dir1=Map[x1][y1].dir;
Map[x1][y1].number=;
Map[x1][y1].have=!Map[x1][y1].have;
// printf("This is case 3\n");
for(i=;i<time;i++)
{
x1++;
if(Map[x1][y1].have) //遇到了其他机器人
{
printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number);
return true;
}
if(Map[x1][y1].dir==-)//撞到了墙
{
printf("Robot %d crashes into the wall\n",number1);
return true;
}
}
Map[x1][y1].have=true;
Map[x1][y1].dir=dir1;
Map[x1][y1].number=number1;
break;
case ://往左走
number1=Map[x1][y1].number;
dir1=Map[x1][y1].dir;
Map[x1][y1].number=;
Map[x1][y1].have=!Map[x1][y1].have;
// printf("This is case 4\n");
for(i=;i<time;i++)
{
y1--;
if(Map[x1][y1].have) //遇到了其他机器人
{
printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number);
return true;
}
if(Map[x1][y1].dir==-)//撞到了墙
{
printf("Robot %d crashes into the wall\n",number1);
return true;
}
}
Map[x1][y1].have=true;
Map[x1][y1].dir=dir1;
Map[x1][y1].number=number1;
break;
}
}
return false;
} int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int T;
cin>>T;
while(T--)
{
cin>>A>>B;
make_Map(B,A);//注意,题目给的方向要反过来
int N,M;
cin>>N>>M;
int i,j,k;
int x1,y1;
char c;
for(i=;i<N;i++)
{
scanf("%d %d %c",&y1,&x1,&c);
Map[x1][y1].have=true;
if(c=='S')
Map[x1][y1].dir=;
else if(c=='E')
Map[x1][y1].dir=;
else if(c=='N')
Map[x1][y1].dir=;
else
Map[x1][y1].dir=;
Map[x1][y1].number=i+;
// cout<<Map[x1][y1].number<<endl;
// cout<<"x1="<<x1<<" "<<"y1="<<y1<<" "<<"c="<<c<<endl;
}
int number1;
char op;
int time;
for(i=;i<M;i++)
{
scanf("%d %c %d",&order[i].num,&order[i].op,&order[i].time);
// printf("%d %c %d\n",order[i].num,order[i].op,order[i].time);
}
bool flag=false;
for(i=;i<M;i++)
{
// printf("num=%d op=%c time%d\n",order[i].num,order[i].op,order[i].time);
if(go(order[i].num,order[i].op,order[i].time))
{
flag=true;
break;
}
}
if(!flag)
printf("OK\n");
}
return ;
}
模拟 --- Crashing Robots的更多相关文章
- 模拟 POJ 2632 Crashing Robots
题目地址:http://poj.org/problem?id=2632 /* 题意:几个机器人按照指示,逐个朝某个(指定)方向的直走,如果走过的路上有机器人则输出谁撞到:如果走出界了,输出谁出界 如果 ...
- Crashing Robots(水题,模拟)
1020: Crashing Robots 时间限制(普通/Java):1000MS/10000MS 内存限制:65536KByte 总提交: 207 测试通过:101 ...
- POJ 2632 Crashing Robots (坑爹的模拟题)
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6599 Accepted: 2854 D ...
- poj2632 Crashing Robots
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9859 Accepted: 4209 D ...
- Crashing Robots(imitate)
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8124 Accepted: 3528 D ...
- Crashing Robots 分类: POJ 2015-06-29 11:44 10人阅读 评论(0) 收藏
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8340 Accepted: 3607 D ...
- poj 2632 Crashing Robots
点击打开链接 Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6655 Accepted: ...
- Poj OpenJudge 百练 2632 Crashing Robots
1.Link: http://poj.org/problem?id=2632 http://bailian.openjudge.cn/practice/2632/ 2.Content: Crashin ...
- POJ2632——Crashing Robots
Crashing Robots DescriptionIn a modernized warehouse, robots are used to fetch the goods. Careful pl ...
随机推荐
- 2019-11-07 微信小程序入门
1.什么是微信小程序? 小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”,用户扫一扫或者搜一下即可打开应用,体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题.应用将无处不 ...
- 【开发工具】- Xshell过期了怎么办?
点击下边链接下载免费版 http://www.netsarang.com/download/free_license.html
- maven 学习---Maven启用代理访问
如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配置文件中设置代理服务器: ...
- C# 连接数据操作的时候抛异常,连接超时
先说说我的业务.我在发送优惠券的时候,同时给6千多个会员发送优惠券,执行了update 和insert语句,这写语句都是通过字符串拼接而来的.update和insert语句加起来一共是一万多条语句.在 ...
- 微信小程序-获取当前位置和城市名
微信小程序-获取当前城市位置 1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数) ...
- Linux Firewalld 基础实例
本次是一个Firewalld的基础操作实例,利用Firewalld图形操作界面进行访问控制操作. 实验拓扑 需求分析 首先拓扑涉及到两个区域,这里使用work和public区域,分别做相应的规则. 1 ...
- Linux进程管理之top
关于Linux进程查看,前面讲解了ps命令,下面拉介绍另一个命令top ps:静态查看 top:动态查看 动态查看进程的状态 # top [root@wei ~]# top top - 18:38:4 ...
- 【会话技术】Cookie技术 案例:访问时间
创建时间:6.30 代码: package cookie; import java.io.IOException; import java.text.SimpleDateFormat; import ...
- python 多进程数量 对爬虫程序的影响
1. 首先看一下 python 多进程的优点和缺点 多进程优点: 1.稳定性好: 多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程.基于这个特性,常常会用多进程来实现守护服务器的功 ...
- 201800628模拟赛T2——最大土地面积
题目描述 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 输入输出格式 输入格式: 第1行一个正整数N,接下来N行,每行2个数x,y ...