1 条题解
-
0
本题考察的是网格图的奇偶性分析。
1. 无解判定
将 的棋盘进行黑白相间染色。由于每次只能上下左右移动一格,所以每移动一步,必然从黑格走到白格,或从白格走到黑格(颜色交替)。
要走遍全部 个格子,总共需要移动 步。因为 是奇数,经过奇数次颜色交替后,终点格子的颜色必然与起点格子相反。
因此,若起点与终点同色,必定无解。 判断两点是否同色,可以判断行号之差的绝对值与列号之差的绝对值的奇偶性是否相同:
- 若 与 的奇偶性相同,说明两点同色,无解。
- 若 与 的奇偶性不同,说明两点异色。
2. 有解条件
若起点和终点异色,在 的无障碍网格中必然存在一条遍历所有格子的路径。直接输出
Yes即可。- 时间复杂度:,仅需进行简单的减法与奇偶性判断。
参考代码 (C++)
#include <iostream> #include <cmath> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; // 判断行差与列差的奇偶性是否相同 if (abs(x1 - x2) % 2 == abs(y1 - y2) % 2) { cout << "No\n"; // 同色,无解 } else { cout << "Yes\n"; // 异色,有解 } return 0; }
附:正确性证明
关于异色必定有解的正确性证明,涉及图论中的哈密顿路径相关知识,有能力可以自行了解。简单来说,证明思路是标准归纳构造:
- 先验证 、 等小矩形。
- 再对矩形行数或列数归纳,剥去不含端点的边界行或列,在较小矩形中构造路径。
- 最后把剥去的整行或整列以“蛇形”方式接入路径。
由于剥去的是边界,异色关系保持不变,因此归纳可以进行。
- 1
信息
- ID
- 1251
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 48
- 已通过
- 17
- 上传者