您的位置:首页 > 其它

poj 2632 模拟

2012-04-06 15:18 281 查看
模拟题,注意两点

1.坐标

2.L,R后边的数字是向左或向右转几次

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxx=102;
int loc[maxx][maxx],a,b;    //loc 地图第ij个位置是第几个机器人
char dir[maxx][maxx];
struct OPE                 //操作
{
int ind;
char op;
int step;
};
OPE ope[maxx];
struct ROBOT               //机器人
{
int x,y;
char di;
};
ROBOT ro[maxx];
void updateloc(int x,int y,int nx,int ny)//更新地图位置
{
loc[nx][ny]=loc[x][y];
loc[x][y]=0;
}
void updatero(int index,int x,int y,char dir)//更新机器人位置、方向
{
ro[index].x=x;
ro[index].y=y;
ro[index].di=dir;
}
bool crashwall(int x,int y)                 //是否撞墙
{
if((x>=1 && x<=b)&&(y>=1 && y<=a))return 0;
else return 1;
}
int crash(int x,int y,int step,char dir)    //撞到第几个机器人
{
int i,j;
switch(dir)
{
case 'W':
{
for(i=x-1;i>=x-step;i--)
{
if(crashwall(i,y))   return -1;
else   if(loc[i][y]) return loc[i][y];
}
updatero(loc[x][y],x-step,y,'W');
updateloc(x,y,x-step,y);
break;
}
case 'E':
{
for(i=x+1;i<=x+step;i++)
{
if(crashwall(i,y))   return -1;
else   if(loc[i][y]) return loc[i][y];
}
updatero(loc[x][y],x+step,y,'E');
updateloc(x,y,x+step,y);
break;
}
case 'N':
{
for(i=y+1;i<=y+step;i++)
{
if(crashwall(x,i))   return -1;
else   if(loc[x][i]) return loc[x][i];
}
updatero(loc[x][y],x,y+step,'N');
updateloc(x,y,x,y+step);
break;
}
default:
{
for(i=y-1;i>=y-step;i--)
{
if(crashwall(x,i))   return -1;
else   if(loc[x][i]) return loc[x][i];
}
updatero(loc[x][y],x,y-step,'S');
updateloc(x,y,x,y-step);
}
}
return 0;
}

int opero(int index,char op,int step)//操作机器人
{
switch(op)
{
case 'F':return crash(ro[index].x,ro[index].y,step,ro[index].di);
case 'L':
switch(ro[index].di)
{

case 'W':   if(step%4==1) ro[index].di='S';
else if(step%4==2) ro[index].di='E';
else if(step%4==3) ro[index].di='N';
else ro[index].di='W';
break;
case 'E':   if(step%4==1) ro[index].di='N';
else if(step%4==2) ro[index].di='W';
else if(step%4==3) ro[index].di='S';
else ro[index].di='E';
break;
case 'N':   if(step%4==1) ro[index].di='W';
else if(step%4==2) ro[index].di='S';
else if(step%4==3) ro[index].di='E';
else ro[index].di='N';
break;
default:    if(step%4==1) ro[index].di='E';
else if(step%4==2) ro[index].di='N';
else if(step%4==3) ro[index].di='W';
else ro[index].di='S';
break;
}
break;
default :
switch(ro[index].di)
{
case 'W':   if(step%4==1) ro[index].di='N';
else if(step%4==2) ro[index].di='E';
else if(step%4==3) ro[index].di='S';
else ro[index].di='W';
break;
case 'E':   if(step%4==1) ro[index].di='S';
else if(step%4==2) ro[index].di='W';
else if(step%4==3) ro[index].di='N';
else ro[index].di='E';
break;
case 'N':   if(step%4==1) ro[index].di='E';
else if(step%4==2) ro[index].di='S';
else if(step%4==3) ro[index].di='W';
else ro[index].di='N';
break;
default:    if(step%4==1) ro[index].di='W';
else if(step%4==2) ro[index].di='N';
else if(step%4==3) ro[index].di='E';
else ro[index].di='S';
break;
}

}
return 0;
}

int main()
{
int n,m,x,y,op,ans,flag,t,tt,i,ans2;
char d;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
for(tt=1;tt<=t;tt++)
{
scanf("%d%d",&b,&a);
flag=0;
memset(dir,0,sizeof(dir));
memset(loc,0,sizeof(loc));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d %d %c",&x,&y,&d);
ro[i].x=x;
ro[i].y=y;
ro[i].di=d;
loc[x][y]=i;
dir[x][y]=d;
}
for(i=1;i<=m;i++)
scanf("%d %c %d",&ope[i].ind,&ope[i].op,&ope[i].step);
for(i=1;i<=m;i++)
{
ans=opero(ope[i].ind,ope[i].op,ope[i].step);
if(ans){flag=1;ans2=ope[i].ind;break;}
}
if(flag)
{
if(ans==-1)
printf("Robot %d crashes into the wall\n",ans2);
else
printf("Robot %d crashes into robot %d\n",ans2,ans);
}
else printf("OK\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: