Sudoku: Difference between revisions

m
Line 1,826:
}</lang>
 
=== Best First Search "Smart" Recursive Backtrack Solution===
<!-- By Martin Freedman, 20/11/2021 -->
<lang csharp>using System.Linq;
Line 1,834:
using System.Runtime.CompilerServices;
 
namespace SudokuSodukoBestFirstSearch {
internal static class SudokuSudokuBFS {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int RowCol(int rc) => rc <= 2 ? 0 : rc <= 5 ? 3 : 6;
private static IEnumerable<int> GetBox(this int[][] grid, int row, int col) =>
from r in Range(RowCol(row), 3) from c in Range(RowCol(col), 3) select grid[r][c];
from c in Range(RowCol(col), 3)
select grid[r][c];
 
private static readonly int[] range = Range(1, 9).ToArray();
private static bool Solve(this int[][] grid, ListIEnumerable<(IEnumerable<int> constraints, int)> cellsrow, int idxcol)> cells) {
if (idx == 81!cells.Any())
return true;
 
var (rconstraints, crow, col) = cells[idx].First();
foreach (var i in range.Except(grid.Hints(r,c)constraints)) {
grid[rrow][ccol] = i;
if (grid.Solve(cells, idx + 1grid.SortedCells()))
return true;
}
grid[rrow][ccol] = 0;
return false;
}
Line 1,862 ⟶ 1,860:
private static readonly int[] domain = Range(0, 9).ToArray();
 
private static IEnumerable<int> HintsConstraints(this int[][] grid, int row, int col) =>
grid[row]
.Union(domain.Select(r => grid[r][col]))
.Union(grid.GetBox(grid, row, col))
.Except(Unmarked);
 
private static IEnumerable<(IEnumerable<int> constraints,int row, int col)> SortedCells(this int[][] grid) =>
from row in domain
from col in domain
let cell = (count:where grid[row][col] >== 0 ? 10 : grid.Hints(row, col).Count(), cell: (row, col))
orderbylet cell = (constraints: grid.countConstraints(row, col), row, descendingcol)
selectorderby cell.cell;constraints.Count() descending
select grid[r][c]cell;
 
private static int[][] Parse(string input) =>
Line 1,887 ⟶ 1,886:
public static int[][] Run(string input) {
var grid = Parse(input);
varreturn hits = inputgrid.WhereSolve(cgrid.SortedCells()) =>? cgrid !=: '0')new int[][] { Array.CountEmpty<int>() };
var sorted = grid.SortedCells().ToList();
return grid.Solve(sorted, hits) ? grid : new int[][] { Array.Empty<int>() };
}
}