boolcanCross(vector<int>& _stones){ stones = _stones; n = stones.size(); if (stones[1] != 1) returnfalse; for (int i = 0; i < n; i++) mp[stones[i]] = i; // 反查表 returndfs(1, 1); } /** * 判定是否能够跳到最后一块石子 * @param ss 石子列表【不变】 * @param n 石子列表长度【不变】 * @param u 当前所在的石子的下标 * @param k 上一次是经过多少步跳到当前位置的 * @return 是否能跳到最后一块石子 */ booldfs(int u, int k){ int key = u * 10000 + k; // 计算一个缓存的 key if (f.count(key)) return f[key]; if (u == n - 1) returntrue; for (int i = -1; i <= 1; i++) { if (k + i == 0) continue; // 跳过原地踏步的情况 int next = stones[u] + k + i; // 如果跳 k + i 步,能否落到石头上 if (mp.count(next)) { bool cur = dfs(mp[next], k + i); f[key] = cur; if (cur) returntrue; } } f[key] = false; returnfalse; } };