前端算法js:跳格子游戏

// 前端算法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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿赛工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值