POJ 2632 *** Crashing Robots

题意:对一个A*B的矩形,每个1*1的小块都是一个坐标,对于N个机器人来说只能在这些坐标上存在,且一个坐标上只能有一个机器人。分别给出这N个机器人初始坐标值以及运动方向,求在给出的指令下N个机器人是否可能撞墙、以及是否相互碰撞。

想法:根据要求每一次的更新机器人的状态,我写的代码好长。。而且改了几次。。。。

代码如下:
#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<sstream>
#include<set>
#include<string>
#include<iterator>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

#define N 0
#define E 1
#define S 2
#define W 3
int X[110], Y[110], P[110];
int mmap[110][110];

int main() {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	int T, A, B, Nn, M;
	char c;
	cin >> T;
	while (T--) {
		memset(mmap, 0, sizeof(mmap));
		cin >> A >> B;
		cin >> Nn >> M;
		for (int i = 1; i <= Nn; ++i) {
			cin >> X[i] >> Y[i] >> c;
			mmap[X[i]][Y[i]] = i;
			switch (c) {
			case'N':P[i] = N; break;
			case'E':P[i] = E; break;
			case'S':P[i] = S; break;
			case'W':P[i] = W; break;
			}
		}
		int num, repeat,temp,flag=1;
		char action;
		for (int i = 1; i <= M; ++i) {
			cin >> num >> action >> repeat;
			if (flag) {
				if (action == 'L') {
					temp = repeat % 4;
					P[num] = (P[num] - temp + 4) % 4;
				}
				else if (action == 'R') {
					temp = repeat % 4;
					P[num] = (P[num] + temp) % 4;
				}
				else if (action == 'F') {
					if (P[num] == N) {
						mmap[X[num]][Y[num]] = 0;
						for (temp = 0; temp < repeat; ++temp) {
							Y[num]++;
							if (Y[num] > B) {
								flag = 0;
								cout << "Robot " << num << " crashes into the wall" << endl;
								break;
							}
							if (mmap[X[num]][Y[num]]) {
								flag = 0;
								cout << "Robot " << num << " crashes into robot "
									<< mmap[X[num]][Y[num]] << endl;
								break;
							}
						}
						mmap[X[num]][Y[num]] = num;
					}
					else if (P[num] == S) {
						mmap[X[num]][Y[num]] = 0;
						for (temp = 0; temp < repeat; ++temp) {
							Y[num]--;
							if (Y[num] < 1) {
								flag = 0;
								cout << "Robot " << num << " crashes into the wall" << endl;
								break;
							}
							else	if (mmap[X[num]][Y[num]]) {
								flag = 0;
								cout << "Robot " << num << " crashes into robot "
									<< mmap[X[num]][Y[num]] << endl;
								break;
							}
						}
						mmap[X[num]][Y[num]] = num;
					}
					else if (P[num] == E) {
						mmap[X[num]][Y[num]] = 0;
						for (temp = 0; temp < repeat; ++temp) {
							X[num]++;
							if (X[num] > A) {
								flag = 0;
								cout << "Robot " << num << " crashes into the wall" << endl;
								break;
							}
							else if (mmap[X[num]][Y[num]]) {
								flag = 0;
								cout << "Robot " << num << " crashes into robot "
									<< mmap[X[num]][Y[num]] << endl;
								break;
							}
						}
						mmap[X[num]][Y[num]] = num;
					}
					else if (P[num] == W) {
						mmap[X[num]][Y[num]] = 0;
						for (temp = 0; temp < repeat; ++temp) {
							X[num]--;
							if (X[num] < 1) {
								flag = 0;
								cout << "Robot " << num << " crashes into the wall" << endl;
								break;
							}
							else if (mmap[X[num]][Y[num]]) {
								flag = 0;
								cout << "Robot " << num << " crashes into robot "
									<< mmap[X[num]][Y[num]] << endl;
								break;
							}
						}
						mmap[X[num]][Y[num]] = num;
					}
				}
			}
		}
		if (flag)cout << "OK" << endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值