5992. 基于陈述统计最多好人数(dfs)

274 阅读1分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

每日刷题第27天 2021.1.23

基于陈述统计最多好人数

题目

  • 游戏中存在两种角色:
    • 好人:该角色只说真话。
    • 坏人:该角色可能说真话,也可能说假话。
  • 给你一个下标从 0 开始的二维整数数组 statements ,大小为 n x n ,表示 n 个玩家对彼此角色的陈述。具体来说,statements[i][j] 可以是下述值之一:
    • 0 表示 i 的陈述认为 j 是 坏人 。
    • 1 表示 i 的陈述认为 j 是 好人 。
    • 2 表示 i 没有对 j 作出陈述。
  • 另外,玩家不会对自己进行陈述。形式上,对所有 0 <= i < n ,都有 statements[i][i] = 2 。

  • 根据这 n 个玩家的陈述,返回可以认为是 好人 的 最大 数目。

示例

  • 示例1 image.png (题目详细信息,篇幅过长,请查看leetcode原题)

  • 示例2 image.png (题目详细信息,篇幅过长,请查看leetcode原题)

提示

  • n == statements.length == statements[i].length
  • 2 <= n <= 15
  • statements[i][j] 的值为 0、1 或 2
  • statements[i][i] == 2

解法

  • 使用dfs模拟
/**
* @param {number[][]} statements
* @return {number}
*/

var maximumGood = function(statements) {
  // 定义dfs
  let ans = 0;
  // 定义记录每一种情况下,每一个人的状况
  let flag = [];
  let len = statements.length;
  let jump = false;

  // 记录1的个数
  let numOne = 0;
  function dfs(n, t) {
    if (n == len) {
      // 需要判断是否有矛盾,没有矛盾则记录下来
      // 1:好人 0:坏人
      numOne = 0;
      for (let i = 0; i < n; i++) {
        // console.log('i',i,flag);
        if (flag[i] == 1) {
          numOne++;
          // console.log('flag',flag[i]);
          // 如果flag为1,表示好人,需要比较
          // i -> 哪个人 ,遍历其的话,看是否有不符的
          for(let j = 0; j < n; j++) {
            // 表示:j -> 1
            if (i == j || statements[i][j] == 2) {
              continue;
            }
            if(flag[j] != statements[i][j]) {
              // jump = true;
              // numOne = 0;
              // break;
              return;
            }
         }
      }
  // if (jump){
  // jump = false;
  // break;
  // }
}

  ans = Math.max(ans,numOne);
  // console.log('获取结果',ans);
  return;
}

  flag[n] = t;
  // 如果不等于,就需要继续递归
  dfs(n + 1, 0);
  dfs(n + 1, 1);
}

dfs(0, 0);
dfs(0, 1);
return ans;
};

附录