示例#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());
                    }
                }
            }
        }
示例#2
0
        public static bool LegalPath(this Cell[,] board, int x, int y)
        {
            if (!board.Contains(x, y) || board[x, y] != Cell.Full)
            {
                return(true);
            }
            var copy = board.Copy();

            FloodFill(copy, x, y, Cell.Full + 1);
            return(!copy.Points().Any(s => copy[s.x, s.y] == Cell.Full));
        }