现在的位置: 首页 > 综合 > 正文

poj2632 Crashing Robots

2013年05月01日 ⁄ 综合 ⁄ 共 2402字 ⁄ 字号 评论关闭

    这是道模拟题,虽然题意很简单,但其中情况很多,所以要细心。无论如何这是我做的第一道模拟题,所以在此还是小庆祝一下奋斗吐舌头

//模拟
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct
{
	int x,y;
	int dirt;//方向,分别用0,1,2,3,表示,可以便于计算
}robot[101];
int A,B,N,M,K;
bool map[101][101];//记录该处是否已经放置了机器人

int main()
{
	scanf("%d",&K);
	bool state;
	int id,times;
	char op;
	while(K--)
	{
		scanf("%d%d%d%d",&A,&B,&N,&M);
		//读入数据
		memset(map,false,sizeof(map));
		for(int i=1;i<=N;i++)
		{
			scanf("%d%d %c",&robot[i].x,&robot[i].y,&op);
			map[robot[i].x][robot[i].y]=true;
			if(op=='N')
				robot[i].dirt=0;
			else if(op=='E')
				robot[i].dirt=1;
			else if(op=='S')
				robot[i].dirt=2;
			else
				robot[i].dirt=3;
		}

		//开始模拟
		state=true;//记录到目前为止是否出现过碰撞或撞墙
		while(M--)
		{
			scanf("%d %c%d",&id,&op,×);
			if(!state)
				continue;
			if(op=='L')
				robot[id].dirt=(robot[id].dirt+4-times%4)%4;
			else if(op=='R')
				robot[id].dirt=(robot[id].dirt+times)%4;
			//此处为向前行进的情况,分4种情况讨论(只需看其中任意一种就行,另外三种类似)
			else
			{
				int k;
				map[robot[id].x][robot[id].y]=false;
				if(robot[id].dirt==0)
				{
					for(int j=1;j<=times;j++)
					{
						if(robot[id].y+j>B)
						{
							printf("Robot %d crashes into the wall\n",id);
							state=false;
							break;
						}
						if(map[robot[id].x][robot[id].y+j])
						{
							for(k=1;k<=N;k++)
								if(robot[k].x==robot[id].x&&robot[k].y==robot[id].y+j)
									break;
							printf("Robot %d crashes into robot %d\n",id,k);
							state=false;
							break;
						}
					}
					if(!state) continue;
					robot[id].y+=times;
					map[robot[id].x][robot[id].y]=true;
				}
				else if(robot[id].dirt==2)
				{
					for(int j=1;j<=times;j++)
					{
						if(robot[id].y-j<=0)
						{
							printf("Robot %d crashes into the wall\n",id);
							state=false;
							break;
						}
						if(map[robot[id].x][robot[id].y-j])
						{
							for(k=1;k<=N;k++)
								if(robot[k].x==robot[id].x&&robot[k].y==robot[id].y-j)
									break;
							printf("Robot %d crashes into robot %d\n",id,k);
							state=false;
							break;
						}
					}
					if(!state) continue;
					robot[id].y-=times;
					map[robot[id].x][robot[id].y]=true;
				}
				else if(robot[id].dirt==1)
				{
					for(int j=1;j<=times;j++)
					{
						if(robot[id].x+j>A)
						{
							printf("Robot %d crashes into the wall\n",id);
							state=false;
							break;
						}
						if(map[robot[id].x+j][robot[id].y])
						{
							for(k=1;k<=N;k++)
								if(robot[k].x==robot[id].x+j&&robot[k].y==robot[id].y)
									break;
							printf("Robot %d crashes into robot %d\n",id,k);
							state=false;
							break;
						}
					}
					if(!state) continue;
					robot[id].x+=times;
					map[robot[id].x][robot[id].y]=true;
				}
				else
				{
					for(int j=1;j<=times;j++)
					{
						if(robot[id].x-j<=0)
						{
							printf("Robot %d crashes into the wall\n",id);
							state=false;
							break;
						}
						if(map[robot[id].x-j][robot[id].y])
						{
							for(k=1;k<=N;k++)
								if(robot[k].x==robot[id].x-j&&robot[k].y==robot[id].y)
									break;
							printf("Robot %d crashes into robot %d\n",id,k);
							state=false;
							break;
						}
					}
					if(!state) continue;
					robot[id].x-=times;
					map[robot[id].x][robot[id].y]=true;
				}
			}
		}
		if(state)
			printf("OK\n");
	}
	return 0;
}

抱歉!评论已关闭.