public SudokuGrid(int?[] grid) { if (grid.Count() != 9 * 9) throw new ArgumentException(); _cells = new List<Cell>(9 * 9); for (int y = 0; y < 9; y++) { for (int x = 0; x < 9; x++) { int? value = grid[y * 9 + x]; Cell cell = new Cell(this, value, x, y); _cells.Add(cell); } } }
int? investigateCell(Cell cell) { if (!cell.IsEmpty) return cell.Value; List<int> pValues = _grid.PossibleValues(cell); if (pValues.Count == 1) return (int?)pValues.First(); List<Cell> block = _grid.BlockOf(cell); block.Remove(cell); foreach (int value in pValues) { int otherPossibleCellsCount = block.Where(cell2 => _grid.PossibleValues(cell2).Contains(value)).Count(); if (otherPossibleCellsCount == 0) return value; } return null; }
public SudokuGrid(SudokuGrid grid) { if (grid == null) throw new ArgumentNullException(); _cells = new List<Cell>(9 * 9); for (int x = 0; x < 9; x++) { for (int y = 0; y < 9; y++) { Cell cell = new Cell(this, grid.Get(x, y).Value, x, y); _cells.Add(cell); } } }
public List<Cell> RowOf(Cell cell) { List<Cell> row = _cells.Where(cell2 => cell2.Y == cell.Y).ToList(); return row; }
public List<int> PossibleValues(Cell cell) { if(!cell.IsEmpty) return new List<int>(new int[]{(int)cell.Value}); List<Cell> column = ColumnOf(cell).Where(cell2 => !cell2.IsEmpty).ToList(); List<Cell> row = RowOf(cell).Where(cell2 => !cell2.IsEmpty).ToList(); List<Cell> block = BlockOf(cell).Where(cell2 => !cell2.IsEmpty).ToList(); List<int> fValues = new List<int>(); fValues.AddRange(column.ConvertAll(cell2 => (int)cell2.Value).ToList()); fValues.AddRange(row.ConvertAll(cell2 => (int)cell2.Value).ToList()); fValues.AddRange(block.ConvertAll(cell2 => (int)cell2.Value).ToList()); List<int> pValues = new List<int>(); for (int i = 1; i <= 9; i++) { if (fValues.Contains(i) == false) pValues.Add(i); } return pValues; }
public List<Cell> ColumnOf(Cell cell) { List<Cell> column = _cells.Where(cell2 => cell2.X == cell.X).ToList(); return column; }
public bool? CantAccept(Cell cell, int value) { if(!PossibleValues(cell).Contains(value)) return true; return null; }
public List<Cell> BlockOf(Cell cell) { int blockX = cell.X - (cell.X % 3); int blockY = cell.Y - (cell.Y % 3); List<Cell> block =new List<Cell>(); for (int x = blockX; x < blockX + 3; x++) { for (int y = blockY; y < blockY + 3; y++) { block.Add(Get(x, y)); } } return block; }