幸运的是,不久前我自己构建了一个数独求解器 :) 整个过程大约有 200 行 C#,它可以在 4 秒或更短的时间内解决我能找到的最棘手的难题。
由于使用了.Count,性能可能不是那么好,但它应该可以工作:
!a.Any(i => i != 0 && a.Where(j => j != 0 && i == j).Count > 1)
此外,这j != 0
部分并不是真正需要的,但它应该可以帮助事情运行得更快一些。
[编辑:] kvb的回答给了我另一个想法:
!a.Where(i => i != 0).GroupBy(i => i).Any(gp => gp.Count() > 1)
在分组前过滤 0 。虽然基于 IEnumerable 的工作方式,但它可能无关紧要。
无论哪种方式,为了获得最佳性能,请.Count > 1
使用如下所示的新 IEnumerable 扩展方法替换其中的任何一个:
bool MoreThanOne(this IEnumerable<T> enumerable, Predictate<T> pred)
{
bool flag = false;
foreach (T item in enumerable)
{
if (pred(item))
{
if (flag)
return true;
flag = true;
}
}
return false;
}
由于数组仅限于 9 个项目,因此它可能不会太重要,但如果你经常调用它,它可能会加起来。