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()); } } } }
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)); }