机器人
//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);
}