c++ - Facebook 编程挑战

标签 c++ algorithm

<分区>

Mastermind 是一款两人游戏。一开始,第一个玩家决定一个秘钥,它是一个序列(s1,s2,...sk)。其中 0 < si <= n , 然后第二个玩家轮流猜测,其中每个猜测的形式都是 (g1,g2, ...gk) ,并且在每次猜测之后,第一个玩家计算猜测的分数。猜测的分数等于我们有 gi = si 的 i 的数量.

例如,如果 key 是 (4,2,5,3,1)猜测是(1,2,3,7,1) ,则得分为 2,因为 g2 = s2g5 = s5 .

给定一系列猜测和每个猜测的分数,您的程序必须确定是否存在至少一个生成这些精确分数的 key 。

输入

第一行输入包含一个整数C (1 <=C <= 100) . C 测试用例如下。每个测试用例的第一行包含三个整数nkq(1 <=n,k <=11, 1<=q<=8) .接下来的 q 行包含猜测。

每个猜测由k 个整数组成gi,1, gi,2,....gi,k用一个空格分隔,然后是猜测的分数 bi (1 <= gi,j <=n for all 1 <=i <=q, 1 <=j <=k; and 0 <= bi <=k )

输出

对于每个测试用例,如果至少存在一个生成这些精确分数的 key ,则输出"is"(不带引号),否则输出“否”。

示例输入

2
4 4 2
2 1 2 2 0
2 2 1 1 1
4 4 2
1 2 3 4 4
4 3 2 1 1

示例输出

Yes
No

除了蛮力,我想不出别的办法,即生成所有可能的 key 并检查所有猜测的相应分数 复杂度非常高,大约需要 (11^11)*8 次操作

请建议一些如何及时做到这一点?

时间限制:3秒

最佳答案

这与 bulls and cows 非常相似游戏。网络上有很多关于它的信息,在 wiki 文章中,您可以找到实现的链接。使它们适应您的具体挑战应该相当容易。

关于c++ - Facebook 编程挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11967310/

相关文章:

c++ - QML 控制层和业务层

C++ string.replace 生成 "No matching function for call"错误

c++ - OpenNI: "Open failed: Device is in safe mode. Cannot start any stream!"

algorithm - 是否重新排列 Floyd-Warshall 算法中的外循环,因为大多数内循环会改变算法

algorithm - 如何计算两个轴承之间的最小旋转

algorithm - 按最近点对位置数组进行排序

c++ - 在 C++ 中,我想从一个函数返回一个对象数组并在另一个函数中使用它

c++ - 关于 std::less 行为的问题

algorithm - 给定一个黑盒子找到一个集合的相等划分,如果存在则返回 true

c - 算法优化(质因数分解)