一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。
给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。
开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。
如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个单位。 另请注意,青蛙只能向前方(终点的方向)跳跃。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/frog-jump
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
广度优先搜索
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Objects;
import java.util.Set;
class Solution {
public static boolean canCross(int[] stones) {
if (stones == null || stones.length == 0) {
return true;
}
Set<Integer> stoneSet = new HashSet<>();
for (int stone : stones) {
stoneSet.add(stone);
}
Set<Process> visited = new HashSet<>();
LinkedList<Process> queue = new LinkedList<>();
Process initProcess = new Process(stones[0], 0);
queue.offer(initProcess);
visited.add(initProcess);
while (!queue.isEmpty()) {
Process process = queue.poll();
if (process.point == stones[stones.length - 1]) {
return true;
}
for (int i = -1; i <= 1; i++) {
int newPoint = process.point + process.step + i;
if (newPoint > process.point && stoneSet.contains(newPoint)) {
Process nextProcess = new Process(newPoint, process.step + i);
if (!visited.contains(nextProcess)) {
queue.offer(nextProcess);
visited.add(nextProcess);
}
}
}
}
return false;
}
}
class Process {
int point;
int step;
public Process(int point, int step) {
this.point = point;
this.step = step;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Process process = (Process) o;
return point == process.point &&
step == process.step;
}
@Override
public int hashCode() {
return Objects.hash(point, step);
}
}