题意:对一个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;
}