Sudoku algorithm in C#

前端 未结 9 988
南方客
南方客 2021-02-03 15:24

I need one liner (or close to it) that verifies that given array of 9 elements doesn\'t contain repeating numbers 1,2,3,...,9. Repeating zeroes do not count (they represent empt

9条回答
  •  心在旅途
    2021-02-03 16:01

    Lucky for you I built a sudoku solver myself not too long ago :) The whole thing was about 200 lines of C#, and it would solve the toughest puzzles I could find line in 4 seconds or less.

    Performance probably isn't that great due to the use of .Count, but it should work:

    !a.Any(i => i != 0 && a.Where(j => j != 0 && i == j).Count >  1)
    

    Also, the j != 0 part isn't really needed, but it should help things run a bit faster.

    [edit:] kvb's answer gave me another idea:

    !a.Where(i => i != 0).GroupBy(i => i).Any(gp => gp.Count() > 1)
    

    Filter the 0's before grouping. Though based on how IEnumerable works it may not matter any.

    Either way, For best performance replace .Count > 1 in either of those with a new IEnumerable extension method that looks like this:

    bool MoreThanOne(this IEnumerable enumerable, Predictate pred)
    {
        bool flag = false;
        foreach (T item in enumerable)
        {
           if (pred(item))
           {
              if (flag)
                 return true;
              flag = true;
           }
        }
        return false;
    }
    

    It probably won't matter too much since arrays are limited to 9 items, but if you call it a lot it might add up.

提交回复
热议问题