// 前端算法js:跳格子游戏
let arrFlag, arrNode, stepAll; // 节点遍历状态,节点的相邻启动点数组,是否完成所有步骤
function jumpGame2(num, arr) {
arrFlag = new Array(num).fill(0); // 初始化节点状态为0 ,1=已经遍历了,死循环;2=该节点已经遍历完成了
stepAll = true; // 默认能完成所有节点
arrNode = []; // 相邻节点启用数组
for (let i = 0; i < num; i++) {
arrNode.push(arr.filter((el) => el[1] == i).map((elc) => elc[0])); // 将数组过滤并map成需要的节点启用数组
}
if (arrNode.some((el) => !el.length)) { // 有没有默认开启的节点
for (let i = 0; i < num && stepAll; i++) { // 对每隔节点使用dfs遍历,判断是否完成全部节点
if (arrFlag[i] == 0) { // 只有当该节点没有被遍历的情况下执行dfs
dfs(i);
}
}
return stepAll ? "yes" : "no"; // 返回结果stepAll来自dfs的遍历处理
} else {
return "no"; // 如果没有默认开启的节点就直接no
}
}
function dfs(index) {
arrFlag[index] = 1; // 第一步设置遍历状态为已遍历
let arrNodeChild = arrNode[index]; // 获取当前节点下的所有启动节点
for (let j = 0, len = arrNodeChild.length; j < len; j++) { // 遍历启动节点
if (arrFlag[arrNodeChild[j]] == 0) { // 如果启动节点未启动状态
dfs(arrNodeChild[j]); // 继续dfs
if (!stepAll) { // 若dfs中遍历到已经遍历过的节点,跳出循环
break;
}
} else if (arrFlag[arrNodeChild[j]] == 1) { // 若遍历到已经遍历过的节点,跳出循环
stepAll = false; // 并设stepAll为false,意思是这个遍历不成功,并跳出循环
break;
}
}
arrFlag[index] = 2; // 若上面循环顺利完成,意思当前节点及其启动节点都已经通过dfs,表示该节点已经遍历完
}
console.log(jumpGame2(3, [[0, 1],[0, 2],])); // yes
console.log(jumpGame2(2, [[1, 0],[0, 1],])); // no
console.log(jumpGame2(4, [[1, 3],[0, 1],[3, 2],[2, 0],])); // no
console.log(jumpGame2(4, [[0, 1],[3, 2],[2, 3],])); // no
console.log(jumpGame2(6, [[0, 1],[0, 2],[0, 3],[0, 4],[0, 5],])); // yes
console.log(jumpGame2(5, [[4, 3],[0, 4],[2, 1],[3, 2],])); // yes
console.log(jumpGame2(4, [[1, 2],[1, 0],])); // yes
前端算法js:跳格子游戏
最新推荐文章于 2024-08-26 20:22:20 发布