poj2632

本题的图与其他题稍有不同,本题以左下角为(0,0)点,列号对应x,行号对应y。

完全模拟即可。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

const int maxa = 101;

struct Robot
{
	int x, y, d;
} robot[maxa];

int dir[4][2] =
{
{ 0, 1 },//e
{ -1, 0 }, //s
{ 0, -1 }, //w
{ 1, 0 } }; //n


int n, m, cx, cy;
int map[maxa][maxa];

void init()
{
	memset(map, 0, sizeof(map));
	cin >> cy >> cx >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> robot[i].y >> robot[i].x;
		getchar();
		switch (getchar())
		{
		case 'E':
			robot[i].d = 0;
			break;
		case 'S':
			robot[i].d = 1;
			break;
		case 'W':
			robot[i].d = 2;
			break;
		case 'N':
			robot[i].d = 3;
			break;
		}
		map[robot[i].x][robot[i].y] = i;
	}
}

bool forward(int a)
{
	map[robot[a].x][robot[a].y] = 0;
	robot[a].x += dir[robot[a].d][0];
	robot[a].y += dir[robot[a].d][1];
	int x = robot[a].x;
	int y = robot[a].y;
	if (x == 0 || x > cx || y == 0 || y > cy)
	{
		printf("Robot %d crashes into the wall\n", a);
		return false;
	}
	if (map[x][y] != 0)
	{
		printf("Robot %d crashes into robot %d\n", a, map[x][y]);
		return false;
	}
	map[x][y] = a;
	return true;
}

bool operate(int a, char op, int times)
{
	if (op == 'F')
	{
		for (int i = 0; i < times; i++)
			if (!forward(a))
				return false;
		return true;
	}
	if (op == 'L')
		robot[a].d -= times;
	else
		robot[a].d += times;
	robot[a].d %= 4;
	if (robot[a].d < 0)
		robot[a].d += 4;
	return true;
}

void finish(int times)
{
	string st;
	while (times--)
		getline(cin, st);
}

void work()
{
	for (int i = 0; i < m; i++)
	{
		int num, time;
		char op;
		cin >> num;
		getchar();
		cin >> op >> time;
		getchar();
		if (!operate(num, op, time))
		{
			finish(m - i - 1);
			return;
		}
	}
	cout << "OK\n";
}

int main()
{
	//freopen("D:\\t.txt", "r", stdin);
	int t;
	cin >> t;
	while (t--)
	{
		init();
		work();
	}
	return 0;
}
posted @ 2011-02-01 14:22  金海峰  阅读(349)  评论(0编辑  收藏  举报