「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
每日刷题第27天 2021.1.23
基于陈述统计最多好人数
- leetcode原题链接:leetcode-cn.com/problems/ma…
- 难度:困难
- 方法:dfs(深度优先搜索),模拟
题目
- 游戏中存在两种角色:
- 好人:该角色只说真话。
- 坏人:该角色可能说真话,也可能说假话。
- 给你一个下标从 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
(题目详细信息,篇幅过长,请查看leetcode原题)
-
示例2
(题目详细信息,篇幅过长,请查看leetcode原题)
提示
n == statements.length == statements[i].length2 <= n <= 15statements[i][j] 的值为 0、1 或 2statements[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;
};