题解 CF1668A【Direction Change】

2022-04-20 15:58:43


题意

有一个大小为 $n \times m$ 的棋盘。你一开始位于左上角 $(1, 1)$,想要走到右下角 $(n, m)$。

每步可以上下左右四个方向移动。但是不能出界,也不能连续两次朝着相同方向移动。问到达目的地的最小步数。

思路

首先思考什么情况下无法达到目的地。当棋盘大小为 $1 \times x (x > 2)$ 的时候,要想不出界,就必须朝着目的地方向移动至少两步,与题意矛盾,故此时无法到达目标。

否则一定可以到达目的地。

  • 当 $n = m$ 时,走对角线就是最优方案(右-下-右-下…),总共需要 $2 \times (n - 1)$ 步
  • 若 $n \not = m$,不妨假设 $n <= m$。首先还是沿 $45$ 度角方向,斜向下走到最远的位置,消耗 $2 \times (n - 1)$ 步;剩下 $m-n$ 个格子横着走。为了满足题目要求,最后这一段需要上下摆动行走,以避免连续两步方向相同。需要区分剩余步数是奇数还是偶数。剩余奇数步的话可以少摆动一次。

代码

void solution() {
  int n, m;
  read(n, m);
  if (n == 1 && m > 2) return print(-1);
  if (m == 1 && n > 2) return print(-1);
  if (n == m) return print(2 * (n - 1));
  if (n > m) std::swap(n, m);
  int ans = (n - 1) * 2;
  ans += (m - n) * 2;
  if ((m - n) & 1) ans -= 1;
  print(ans);
}