让我们说你有名单α
,β
和ɣ
。
让ABC = α ∩ β ∩ ɣ
让AB = α ∩ β \ ABC
让AC = α ∩ ɣ \ ABC
让BC = β ∩ ɣ \ ABC
让A = α \ (β ∪ ɣ)
让B = β \ (α ∪ ɣ)
让C = ɣ \ (α ∪ β)
让| X |是集合X的基数。
返回true,当且仅当|A| + |B| + |C| + |AB| + |AC| + |BC| + |ABC| >= 3
实现示例:
void Main()
{
var alpha = new List<string> { "apple", "pear", };
var beta = new List<string> { "banana", };
var gamma = new List<string> { "banana", "apple", };
Console.WriteLine(Compute(alpha, beta, gamma));
Console.WriteLine(ComputeWithSets(alpha, beta, gamma));
alpha = new List<string> { "apple", "pear", };
beta = new List<string> { "apple", "pear", };
gamma = new List<string> { "apple", "pear", };
Console.WriteLine(Compute(alpha, beta, gamma));
Console.WriteLine(ComputeWithSets(alpha, beta, gamma));
alpha = new List<string> { "apple", "pear", "banana", };
beta = new List<string> { "apple", "pear", "banana", };
gamma = new List<string> { "apple", "pear", "banana", };
Console.WriteLine(Compute(alpha, beta, gamma));
Console.WriteLine(ComputeWithSets(alpha, beta, gamma));
}
bool Compute(List<string> alpha, List<string> beta, List<string> gamma)
{
if (alpha.Count == 0) return false;
if (beta.Count == 0) return false;
if (gamma.Count == 0) return false;
foreach (var a in alpha)
foreach (var b in beta)
if (a != b)
foreach (var c in gamma)
if (c != a && c != b)
{
Console.Write(string.Format("{0},{1},{2} =>", a, b, c));
return true;
}
return false;
}
bool ComputeWithSets(List<string> alpha, List<string> beta, List<string> gamma)
{
var abc = alpha.Intersect(beta.Intersect(gamma));
var abcCardinality = abc.Count();
var count = abcCardinality;
if (count >= 3) return true;
var ab = alpha.Intersect(beta).Except(abc);
count += ab.Count();
if (count >= 3) return true;
var bc = beta.Intersect(gamma).Except(abc);
count += bc.Count();
if (count >= 3) return true;
var ac = alpha.Intersect(gamma).Except(abc);
count += ac.Count();
if (count >= 3) return true;
var a = alpha.Except(ab).Except(ac).Except(abc);
count += a.Count();
if (count >= 3) return true;
var b = beta.Except(ab).Except(bc).Except(abc);
count += b.Count();
if (count >= 3) return true;
var c = gamma.Except(ac).Except(bc).Except(abc);
count += c.Count();
if (count >= 3) return true;
return false;
}
解决此问题的一种方法是创建一棵树,每个级别都有一个列表中的所有可能性。之后,使用任何树搜索算法都可以工作。 – Th0rndike
谢谢...我已经搜索了一些树木,但我不知道如何实现这种情况! –
我认为你应该改写这个_我可以从每个列表中选择一个项目,并确保每个选择的项目都与其他选择的项目不同 - 比如说**在每个列表中取一项,是否有可能有没有重复?** – hoang