Crashing Robots

Crashing Robots

在这里插入图片描述
在这里插入图片描述

Sample Input:
在这里插入图片描述
在这里插入图片描述
一道比较复杂的模拟题,一句话:细节决定成败!
我还是没有对结构体太敏感,以后还是要多用,提高代码的效率!
代码注释说明一切:
(它很长,请你忍一下(其实也不长)~ :

//麻烦的模拟题 
#include<iostream>
#include<cstdio>
#include<Cstring>
using namespace std;
//使用结构体更加简洁!(一开始用的数组,菜菜~) 
struct Robot {
	int x, y;
	char p;
}robot[105];
struct Ins {
	int r, num;
	char act;
}ins[105];
int main() {
	bool flag;
	int k;
	cin >> k;
	while (k--) {
		int a, b, n, m;
		cin >> a >> b >> n >> m;
		int map[105][105];
		memset(map, 0, sizeof(map));
		for (int i = 1;i <= n;i++) {
			cin >> robot[i].x >> robot[i].y >> robot[i].p;
			map[robot[i].x][robot[i].y] = i;//标记每个机器人的位置 
		}
		for (int j = 1;j <= m;j++) cin >> ins[j].r >> ins[j].act >> ins[j].num;
		for (int j = 1;j <= m;j++) {
			flag = false;
			if (ins[j].act == 'L') {
				for (int i = 1;i <= ins[j].num % 4;i++) {
					//既然是重复移动,我们进行取余数操作避免不必要的重复 
					switch (robot[ins[j].r].p) {
					case 'N':robot[ins[j].r].p = 'W';break;
					case 'W':robot[ins[j].r].p = 'S';break;
					case 'S':robot[ins[j].r].p = 'E';break;
					case 'E':robot[ins[j].r].p = 'N';break;
					}
				}
			}
			if (ins[j].act == 'R') {
				for (int i = 1;i <= ins[j].num % 4;i++) {
					switch (robot[ins[j].r].p) {
					case 'N':robot[ins[j].r].p = 'E';break;
					case 'E':robot[ins[j].r].p = 'S';break;
					case 'S':robot[ins[j].r].p = 'W';break;
					case 'W':robot[ins[j].r].p = 'N';break;
					}
				}
			}
			if (ins[j].act == 'F') {
				for (int i = 1;i <= ins[j].num;i++) {
					//四个方向举一反四 
					if (robot[ins[j].r].p == 'E') {
						if (robot[ins[j].r].x == a) {
							/*为什么是等于 a 的时候撞墙?因为说等于 a-1 的时候会进行下面的 else 操作,
							也就是说如果这时候步数走完了,最后会停在 a 处(见 else 代码),那么如果
							等于 a 了呢?这不就说明了撞墙了吗?*/
							cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
							flag = true;
							break;
						}
						if (map[robot[ins[j].r].x + 1][robot[ins[j].r].y]) {
							cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x + 1][robot[ins[j].r].y] << endl;
							flag = true;
							break;
						}
						else {
							map[robot[ins[j].r].x + 1][robot[ins[j].r].y] = ins[j].r;
							map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
							robot[ins[j].r].x++;
						}
					}
					if (robot[ins[j].r].p == 'W') {
						if (robot[ins[j].r].x == 1) {
							cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
							flag = true;
							break;
						}
						if (map[robot[ins[j].r].x - 1][robot[ins[j].r].y]) {
							cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x - 1][robot[ins[j].r].y] << endl;
							flag = true;
							break;
						}
						else {
							map[robot[ins[j].r].x - 1][robot[ins[j].r].y] = ins[j].r;
							map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
							robot[ins[j].r].x--;
						}
					}
					if (robot[ins[j].r].p == 'N') {
						if (robot[ins[j].r].y == b) {
							cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
							flag = true;
							break;
						}
						if (map[robot[ins[j].r].x][robot[ins[j].r].y + 1]) {
							cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x][robot[ins[j].r].y + 1] << endl;
							flag = true;
							break;
						}
						else {
							map[robot[ins[j].r].x][robot[ins[j].r].y + 1] = ins[j].r;
							map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
							robot[ins[j].r].y++;
						}
					}
					if (robot[ins[j].r].p == 'S') {
						if (robot[ins[j].r].y == 1) {
							cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
							flag = true;
							break;
						}
						if (map[robot[ins[j].r].x][robot[ins[j].r].y - 1]) {
							cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x][robot[ins[j].r].y - 1] << endl;
							flag = true;
							break;
						}
						else {
							map[robot[ins[j].r].x][robot[ins[j].r].y - 1] = ins[j].r;
							map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
							robot[ins[j].r].y--;
						}
					}
				}
			}
			if (flag) break;
		}
		if (!flag) cout << "OK" << endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值