Example #1
0
        public static IEnumerable <Cell[, ]> Solve(Cell[,] board)
        {
            board = board.Copy();
            var i        = 0;
            var unknowns = board.Points()
                           .Where(s => board[s.x, s.y] == Cell.Unknown)
                           .ToArray();

            while (i >= 0)
            {
                var(x, y) = unknowns[i];
                var cell           = board[x, y];
                int nextGuessIndex = cell == Cell.Unknown ? 0 : Array.IndexOf(FillOptions, cell) + 1;
                if (nextGuessIndex >= FillOptions.Length)
                {
                    board[x, y] = Cell.Unknown;
                    i--;
                    continue;
                }
                board[x, y] = FillOptions[nextGuessIndex];
                if (board.LegalSquare(x, y) && board.LegalNumbers(x, y))
                {
                    if (i < unknowns.Length - 1)
                    {
                        i++;
                    }
                    else if (board[x, y] == Cell.Full && board.LegalPath(x, y) || board[x, y] != Cell.Full && board.LegalPath())
                    {
                        yield return(board.Copy());
                    }
                }
            }
        }
Example #2
0
 public static bool Legal(this Cell[,] board) =>
 board.LegalSquare() &&
 board.LegalPath() &&
 board.LegalNumbers();
Example #3
0
 public static bool Legal(this Cell[,] board, int x, int y) =>
 board.LegalSquare(x, y) &&
 board.LegalNumbers(x, y);