POJ 2632 Crashing Robots 模拟的方法

   题目:http://poj.org/problem?id=2632

   题目大意:在一个棋盘上,几只坦克在上面轮流运动,有三种运动方式,L,R,F,L:向左转90度,t次,R:向右转90度,t次,F:向前走一步,t次。找出第一次发生碰撞的可能性。思路很简单,使用模拟的方法。

   代码如下:

#include <stdio.h>
#include <string>

#define  ONLINE

void online()
{
#ifdef ONLINE
#else
	freopen("2632.in","r", stdin);
	freopen("2632.out", "w", stdout);
#endif
}

struct Robot
{
	int x;
	int y;
	int d;
};

struct Instructor
{
	int r; //坦克
	char o; //指令
	int t; // 时间
};

const int N = 0;
const int E= 1;
const int S = 2;
const int W = 3;

const int LEN = 101;

int a, b;
int n, m;
int map[LEN][LEN];
Robot robots[LEN];
int cas;
Instructor ins[LEN];

//打印结果
void print(int r1, int r2)
{
	if (r1 == -1 && r2==-1)
	{
		printf("OK\n");
	}
	else if (r1 != -1 && r2 == -1)
	{
		printf("Robot %d crashes into the wall\n", r1);
	}
	else
		printf("Robot %d crashes into robot %d\n", r1, r2);

}

//查找相撞的坦克
int search(int x, int y, int idx)
{
	for (int i=1; i <= n; i ++)
	{
		if (robots[i].x == x && robots[i].y == y&& i != idx)
		{
			return i;
		}
	}
	return -1;
}

//开始模拟
void imitate()
{
	for (int i=0; i < m; i ++)
	{
		int idx = ins[i].r;

		if (ins[i].o == 'L')
		{
			robots[idx].d = (robots[idx].d + 3 * ins[i].t) % 4;
		}
		else if (ins[i].o == 'R')
		{
			robots[idx].d = (robots[idx].d + ins[i].t) % 4;
		}
		else if (ins[i].o == 'F')
		{
			for (int j=0; j < ins[i].t; j ++)
			{
				if (robots[idx].d == N)
				{
					map[robots[idx].x][robots[idx].y] = 0;
					robots[idx].y ++;

					if (robots[idx].y  > b)
					{
						print(idx, -1);
						return;
					}
					else if (map[robots[idx].x][robots[idx].y] == 1)
					{
						int r2 = search(robots[idx].x, robots[idx].y, idx);
						print(idx, r2);
						return;
					}
					else
					{
						map[robots[idx].x][robots[idx].y] = 1;
					}//end else
				}//end N
				else if (robots[idx].d == E)
				{
					map[robots[idx].x][robots[idx].y] = 0;
					robots[idx].x ++;

					if (robots[idx].x  > a)
					{
						print(idx, -1);
						return;
					}
					else if (map[robots[idx].x][robots[idx].y] == 1)
					{
						int r2 = search(robots[idx].x, robots[idx].y, idx);
						print(idx, r2);
						return;
					}
					else
					{
						map[robots[idx].x][robots[idx].y] = 1;
					}//end else
				}//end E
				else if (robots[idx].d == S)
				{
					map[robots[idx].x][robots[idx].y] = 0;
					robots[idx].y --;

					if (robots[idx].y  <= 0)
					{
						print(idx, -1);
						return;
					}
					else if (map[robots[idx].x][robots[idx].y] == 1)
					{
						int r2 = search(robots[idx].x, robots[idx].y, idx);
						print(idx, r2);
						return;
					}
					else
					{
						map[robots[idx].x][robots[idx].y] = 1;
					}//end else
				}//end S
				else if (robots[idx].d == W)
				{
					map[robots[idx].x][robots[idx].y] = 0;
					robots[idx].x --;

					if (robots[idx].x  <= 0)
					{
						print(idx, -1);
						return;
					}
					else if (map[robots[idx].x][robots[idx].y] == 1)
					{
						int r2 = search(robots[idx].x, robots[idx].y, idx);
						print(idx, r2);
						return;
					}
					else
					{
						map[robots[idx].x][robots[idx].y] = 1;
					}//end else
				}//end W
			}
		}//end F
	}//end for
	print(-1, -1);
}

//读入数据
void read()
{
	scanf("%d", &cas);

	while(cas > 0)
	{
		scanf("%d%d", &a, &b);
		scanf("%d%d", &n, &m);

		memset(map,0, LEN * LEN * sizeof(int));
		for(int i=1; i <= n; i ++)
		{
			int x, y;
			char c;
			scanf( "%d%d %c", &x, &y, &c);
			map[x][y] = 1;
			robots[i].x = x;
			robots[i].y = y;

			if (c == 'N')
			{
				robots[i].d = N;
			}
			else if (c == 'E')
			{
				robots[i].d = E;
			}
			else if (c == 'S')
			{
				robots[i].d = S;
			}
			else if (c == 'W')
			{
				robots[i].d = W;
			}
		}//end for

		for (int i=0; i < m; i ++)
		{
			scanf("%d %c %d", &ins[i].r, &ins[i].o, &ins[i].t);
		}//end for instructor

		imitate();
		cas --;
	}
}

int main()
{
	online();
	read();

	return 0;
}
   运行结果如下:

2632Accepted208K0MSC++3940B2011-08-02 13:44:18


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值