К счастью для вас, я сам не так давно построил решатель судоку :) Все это было около 200 строк C #, и это решило бы самые сложные головоломки, которые я мог найти, за 4 секунды или меньше.
Производительность, вероятно, не так велика из-за использования .Count, но она должна работать:
!a.Any(i => i != 0 && a.Where(j => j != 0 && i == j).Count > 1)
Кроме того, j != 0
часть на самом деле не нужна, но она должна помочь вещам работать немного быстрее.
[edit:] Ответ 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 элементами, но если вы их много называете, это может сложиться.