翻译
[ABC289F] Teleporter Takahashi
首先,我们考虑一维问题:
- 首先,高桥君位于数轴上的坐标位置
。我们希望通过重复操作“选择 ,将高桥君移动到与 对称的位置”将高桥君移动到 。
当选择
当
当
现在回到二维问题。需要满足
当
- 当
且 时(即不管怎么变化横坐标都不行) - 当
且 时(即不管怎么变化纵坐标都不行) - 当
且 且 且 时(尽管二个都满足,但是它们并不是一个奇偶性所对应的) - 当
且 且 且 时(尽管二个都满足,但是它们并不是一个奇偶性所对应的)
以上情况的答案为No
。
如果操作次数确定为偶数次或无法确定,那么
类似地,通过重复操作
所需操作次数为
如果操作次数确定为奇数次(即不能只用偶数次,那么一定有一维被锁死),可以通过事先对某个点进行操作来将问题转化为偶数次操作的情况。(这样就可以将锁死的一维解放)例如,选择对
总结如下:
- 如果
和 或 和 的奇偶性不匹配,则答案为No
。 - 如果满足以下情况之一,则答案为
No
: 且 且 且 且 且 且 且 且
- 否则,答案为
Yes
。 - 如果
且 ,或者 且 ,则进行操作 。 - 如果
,则重复操作 或 中合适的操作。 - 如果
,则重复操作 或 中合适的操作。
以下是实现示例。在这类问题中,定义一个将操作和输出结合在一起的函数可能会使代码更易于实现。
(附加:可以找到最短的操作序列。)
#include <iostream>
int main() {
using namespace std;
long sx, sy, tx, ty, a, b, c, d;
cin >> sx >> sy >> tx >> ty >> a >> b >> c >> d;
// 如果坐标的奇偶性不匹配,则输出 No
if ((sx ^ tx) % 2 != 0 || (sy ^ ty) % 2 != 0) {
cout << "No" << endl;
return 0;
}
// 可能性_0:能否通过偶数次操作到达
// 可能性_1:能否通过奇数次操作到达
bool 可能性_0{(a != b || sx == tx) && (c != d || sy == ty)};
bool 可能性_1{(a != b || sx + tx == a + b) && (c != d || sy + ty == c + d)};
// 如果两者都不可能,则输出 No
if (!可能性_0 && !可能性_1) {
cout << "No" << endl;
return 0;
}
// 否则,输出 Yes
cout << "Yes" << endl;
// 定义操作函数
const auto 操作{[&sx, &sy](long x, long y){
cout << x << " " << y << endl;
sx = 2 * x - sx;
sy = 2 * y - sy;
}};
// 如果无法通过偶数次操作,则先进行一次操作
if (!可能性_0) 操作(a, c);
// 逐步调整坐标,使其相差为2的倍数
while (sx < tx) { // 增加 x 坐标
操作(a, c);
操作(a + 1, c);
}
while (sx > tx) { // 减少 x 坐标
操作(a + 1, c);
操作(a, c);
}
while (sy < ty) { // 增加 y 坐标
操作(a, c);
操作(a, c + 1);
}
while (sy > ty) { // 减少 y 坐标
操作(a, c + 1);
操作(a, c);
}
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17687451.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步