机器人

//https://acm.creative3605.com/contest/156/problem/B
思路:直接计算第一轮结束后的位置和方向,再通过第一轮推接下来t-1伦,需要注意方向,例如对于第一轮机器人从0,0面朝上,最终走到1,3,此时我面朝又,那对于第二轮的机器人y的负半轴是上一轮的1,而x的正半轴则是那个3,所以是x-y1,y+x1,接下来的面以此推断。

点击查看代码
cin >> n >> t;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}

	// 初始化方向朝上
	d = 0;

	// 通过第一次推断后免得
	for (int i = 1; i <= n; i++)
	{

		x += a[i] * dx[d / 90]; // d / 90 将当前方向转换为下标。例如d/90为0,则面超上,向x轴正半轴走,此时y轴不动

		y += a[i] * dy[d / 90];
		d = (d + a[i] * 90) % 360; // 每次移动玩都顺时针转九十度更新方向
	}

	ll x1 = x, y1 = y, c1 = d; // 记录第一次执行后的位置和方向,通过第一次的位置和方向来推断接下来t-1此;

	for (int i = 2; i <= t; i++)
	{
		if (d == 0) // 方向为0代表向上,直接加记录的变化量
		{
			x += x1;
			y += y1;
		}
		else if (d == 90) // 为90度,朝右,x要减去y1,例如,第一次我从(0,0)面朝上走到1,3后面朝右,那我在1,3这个点的右边相等于朝向了x的负半轴,而正前方则是y轴的正半轴,下面依次类推
		{
			x -= y1;
			y += x1;
		}
		else if (d == 180) // 下
		{
			x -= x1;
			y -= y1;
		}
		else if (d == 270) // 左
		{
			x += y1;
			y -= x1;
		}

		// 每一次转向度数相同,判断方向
		d = (d + c1) % 360;
	}
	cout << abs(x) + abs(y);
}

y -= y1;
}
else if (d == 270)
{
	x += y1;
	y -= x1;
}
d = (d + c1) % 360;
}
cout << abs(x) + abs(y);
}
posted @ 2024-07-25 19:22  台州第一深情  阅读(19)  评论(0编辑  收藏  举报