POJ 2632: Crashing Robots 哎呀!撞了!

本文介绍了一道关于机器人模拟行走并判断碰撞情况的问题。通过定义方向与坐标变化,利用数组来跟踪每个机器人位置的变化,实现了对机器人是否撞墙或与其他机器人碰撞的判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:Crashing Robots

题目大意:给定房间大小和一些机器人的坐标,看机器人在给定的一系列动作下是否会撞墙或撞上其他机器人。

大致思路:模拟,关键是方向之间的转换,设其中一个方向比如W为0,则按逆时针方向 S为1、E为2、N为3;另外还要考虑到前进时坐标的变换,所以可以定义一个二维数组。具体代码实现如下:

#include <cstdio>
#include <cstring>

int vec[4][2] = {{0,1},{-1,0},{0,-1},{1,0}};
int x[10005];
int y[10005];
int dir[10005];
int grid[105][105];
int breadth, depth;

int toDir(char ch) {
	if(ch=='N') return 0;
	if(ch=='W') return 1;
	if(ch=='S') return 2;
	if(ch=='E') return 3;
	return -1;
}
bool move(int order, int repeat) {
	grid[x[order]][y[order]] = 0;
	for(int j=0; j<repeat; j++) {
		x[order] += vec[dir[order]][0];
		y[order] += vec[dir[order]][1];
		if(grid[x[order]][y[order]]!=0) {
			printf("Robot %d crashes into robot %d\n", order, grid[x[order]][y[order]]);
			return false;
		}
		if(x[order]>breadth || x[order]<1 || y[order]<1 || y[order]>depth) {
			printf("Robot %d crashes into the wall\n", order);
			return false;
		}
	}
	grid[x[order]][y[order]] = order;
	return true;
}

int main() {
	int N, rnum, inum, i, order, repeat, flag;
	char ch, action;
	scanf("%d", &N);
	while(N--) {
		memset(grid, 0, sizeof(grid));
		scanf("%d%d", &breadth, &depth);
		scanf("%d%d", &rnum, &inum);
		for(i=1; i<=rnum; i++) {
			scanf("%d %d %c", &x[i], &y[i], &ch);
			dir[i] = toDir(ch);
			grid[x[i]][y[i]] = i;
		}
		flag = 1;
		for(i=1; i<=inum; i++) {
			scanf("%d %c %d", &order, &action, &repeat);
			if(flag) {
				if(action == 'L') {
					dir[order] += repeat%4;
					dir[order] = dir[order]%4;
				}
				else if(action == 'R') {
					dir[order] -= repeat%4;
					dir[order] = (dir[order]+4)%4;
				}
				else {
					if(!move(order, repeat)) flag = 0;
				}
			}
		}
		if(flag) printf("OK\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值