POJ2632

机器人碰撞模拟
本文介绍了一个使用二维数组模拟机器人运动及碰撞的程序。该程序通过读取输入文件中的机器人初始位置和指令,模拟机器人在限定区域内的移动,并检测机器人之间的碰撞或与边界的碰撞。

模拟robot,用一个二维数组来存放各个robot的位置和方向,但是注意二维数组的方向和实际的相差90°,理解的时候需转换

 

代码:

#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef struct p{
int x;
int y;
int c;
}P;
int main()
{
freopen("F://学习//算法//codeblock//11//in.txt","r",stdin);
//freopen("F://学习//算法//codeblock//11//in.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--){
int a,b,n,m;
scanf("%d%d%d%d",&a,&b,&n,&m);
int f[101][101];
memset(f,0,sizeof(f));
int i;
char c1;
P r[101];
for(i=1;i<=n;i++){
scanf("%d%d %c",&r[i].x,&r[i].y,&c1);
if(c1=='N'){
r[i].c=0;
}else if(c1=='W'){
r[i].c=1;
}else if(c1=='S'){
r[i].c=2;
}else{
r[i].c=3;
}
f[r[i].x][r[i].y]=i;
}
int j,cnt;
bool flag=false,flag1=false;
for(i=1;i<=m;i++){
scanf("%d %c%d",&j,&c1,&cnt);
if(flag||flag1){
continue;
}
if(c1=='L'){
cnt=cnt%4;
r[j].c=(r[j].c+cnt)%4;
}else if(c1=='R'){
cnt=cnt%4;
r[j].c=(r[j].c-cnt+4)%4;
}else{
int k;
if(r[j].c==0){
for(k=r[j].y+1;k<=b&&k<=r[j].y+cnt;k++){
if(f[r[j].x][k]!=0){
printf("Robot %d crashes into robot %d\n",f[r[j].x][r[j].y],f[r[j].x][k]);
flag=true;
break;
}
}
if(!flag){
if(r[j].y+cnt>b){
printf("Robot %d crashes into the wall\n",f[r[j].x][r[j].y]);
flag1=true;
continue;
}
f[r[j].x][r[j].y+cnt]=j;
f[r[j].x][r[j].y]=0;
r[j].y+=cnt;
}
}else if(r[j].c==1){
for(k=r[j].x-1;k>=1&&k>=r[j].x-cnt;k--){
if(f[k][r[j].y]!=0){
printf("Robot %d crashes into robot %d\n",f[r[j].x][r[j].y],f[k][r[j].y]);
flag=true;
break;
}
}
if(!flag){
if(r[j].x-cnt<1){
printf("Robot %d crashes into the wall\n",f[r[j].x][r[j].y]);
flag1=true;
continue;
}
f[r[j].x-cnt][r[j].y]=j;
f[r[j].x][r[j].y]=0;
r[j].x-=cnt;
}
}else if(r[j].c==2){
for(k=r[j].y-1;k>=1&&k>=r[j].y-cnt;k--){
if(f[r[j].x][k]!=0){
printf("Robot %d crashes into robot %d\n",f[r[j].x][r[j].y],f[r[j].x][k]);
flag=true;
break;
}
}
if(!flag){
if(r[j].y-cnt<1){
printf("Robot %d crashes into the wall\n",f[r[j].x][r[j].y]);
flag1=true;
continue;
}
f[r[j].x][r[j].y-cnt]=j;
f[r[j].x][r[j].y]=0;
r[j].y-=cnt;
}
}else{
for(k=r[j].x+1;k<=a&&k<=r[j].x+cnt;k++){
if(f[k][r[j].y]!=0){
printf("Robot %d crashes into robot %d\n",f[r[j].x][r[j].y],f[k][r[j].y]);
flag=true;
break;
}
}
if(!flag){
if(r[j].x+cnt>a){
printf("Robot %d crashes into the wall\n",f[r[j].x][r[j].y]);
flag1=true;
continue;
}
f[r[j].x+cnt][r[j].y]=j;
f[r[j].x][r[j].y]=0;
r[j].x+=cnt;
}
}
}
}
if(!flag&&!flag1){
printf("OK\n");
}
}
return 0;
}


 

转载于:https://www.cnblogs.com/God-froest/archive/2012/03/08/POJ2632.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值