您的位置:首页 > 其它

PKU 2632 Crashing Robots 模拟

2010-06-05 00:14 483 查看
题意简述:在一个b*a的矩形框内,有n个机器人,告诉其初始位置及方向。

    现有m条指令,每条指令可能是转向或者向前走一步。

    试判断有没有冲突或者撞墙的情况。

解题思路:模拟

题目链接:http://162.105.81.212/JudgeOnline/problem?id=2632

//模拟
#include<iostream>
using namespace std;

struct robot{
int x,y;     //x:机器人所在行;  y:所在列
int pr;      //当前方向
}rob[102];

int map[102][102];
int a,b;          //a:地图的列 b:行
int rob1,rob2;    //记录二个机器人的序号

int pree(char i)//求解方向
{   switch(i)
{  case 'E': return 0;
case 'S': return 1;
case 'W': return 2;
case 'N': return 3;
}
}

bool move(int num,int pr,int cc)
{   int x=0,y=0,bu=0;
map[rob[num].x][rob[num].y]=0;
if(pr=='F')//如果是向前移动
{   switch(rob[num].pr)
{  case 0:rob[num].y+=cc;x=rob[num].x;bu=cc;break;
case 1:rob[num].x+=cc;y=rob[num].y;bu=cc;break;
case 2:rob[num].y-=cc;x=rob[num].x;bu=-cc;break;
case 3:rob[num].x-=cc;y=rob[num].y;bu=-cc;break;
}
if(x!=0)//行不变
{
if(bu<0)//向西移动
{   //i初始值表示:rob【num】的此次未移动前的列标减 1
//i的终点是1 或rob【num】.y(移动后的位置)
//i 的值减减知道遇到map中的rob(机器人) 就return false;
for(int i=rob[num].y-bu-1;i>=1&&i>=rob[num].y;i--)
if(map[x][i]!=0)
{ rob1=num;  rob2=map[x][i];return false;}
if(rob[num].y<1)  {rob1=num;return false;}
}
else if(bu>0)//向东移动
{
for(int i=rob[num].y-bu+1;i<=a&&i<=rob[num].y;i++)
if(map[x][i]!=0)
{  rob1=num;   rob2=map[x][i];return false;}
if(rob[num].y>a)  {rob1=num;return false;}
}
}
else//列不变
{
if(bu<0)
{   for(int i=rob[num].x-bu-1;i>=1&&i>=rob[num].x;i--)
if(map[i][y]!=0)
{ rob1=num;  rob2=map[i][y];return false;}
if(rob[num].x<1)  {rob1=num;return false;}
}
else if(bu>0)
{
for(int i=rob[num].x-bu+1;i<=b&&i<=rob[num].x;i++)
if(map[i][y]!=0)
{  rob1=num;   rob2=map[i][y];return false;}
if(rob[num].x>b)  {rob1=num;return false;}
}
}
map[rob[num].x][rob[num].y]=num;
}
else
{   cc%=4;
if(pr=='L')
{   rob[num].pr=(rob[num].pr-cc+4)%4; }
else
{    rob[num].pr=(rob[num].pr+cc)%4;}
}
return true;
}

int main()
{
int t,num,cc;;
int n,m,x,y;
bool flag;
char pr;

cin>>t;
while(t--)
{  cin>>a>>b;  cin>>n>>m;

memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
{   cin>>y>>x>>pr;
map[b-x+1][y]=i;
rob[i].pr=pree(pr); rob[i].x=b-x+1;rob[i].y=y;
}

rob1=rob2=0;  flag=true;//rob1和rob2值付 0
for(int i=1;i<=m;i++)
{   cin>>num>>pr>>cc;
if(!flag) continue;
flag=move(num,pr,cc);
}

if(flag) cout<<"OK"<<endl;
else if(rob2==0) //rob2==0表示没有撞到rob(机器人)。
cout<<"Robot "<<rob1<<" crashes into the wall"<<endl;
else cout<<"Robot "<<rob1<<" crashes into robot "<<rob2<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bi