private void BruteForce() { for (int i = 0; i < Size; ++i) { for (int k = 0; k < Size; ++k) { SudokuPiece sp = board[i, k]; if (sp.Value != 0 || sp.PossibleValues.Count != 2) { continue; } var clone1 = (SudokuPuzzle)this.Clone(); clone1.board[i, k] = new SudokuPiece(sp.PossibleValues[0]); clone1.Solve(); if (clone1.RemainingPieces == 0) { this.board = clone1.board; } else { var clone2 = (SudokuPuzzle)this.Clone(); clone2.board[i, k] = new SudokuPiece(sp.PossibleValues[1]); clone2.Solve(); if (clone2.RemainingPieces == 0) { this.board = clone2.board; } } } } }
internal SudokuPiece[] GetRow(int row) { var result = new SudokuPiece[Size]; for (int i = 0; i < Size; i++) { result[i] = board[row, i]; } return result; }
internal SudokuPiece[] GetColumn(int column) { var result = new SudokuPiece[Size]; for (int i = 0; i < Size; i++) { result[i] = board[i, column]; } return result; }
private bool UpdateCandidatesOnY(int i, KeyValuePair<int, int> item) { SudokuPiece sp = board[i, item.Value]; if (sp.Value != 0) { return false; } sp.PossibleValues.Remove(item.Key); if (sp.PossibleValues.Count == 1) { AssignCell(i, item.Value, sp.PossibleValues[0]); return true; } return false; }
private static IDictionary<int, CandidateHelper> UniquePencilmarks(IList<SudokuPiece> p) { Dictionary<int, CandidateHelper> result = new Dictionary<int, CandidateHelper>(); for (int i = 0; i < p.Count; ++i) { SudokuPiece sp = p[i]; if (sp.Value != 0 || sp.PossibleValues == null || sp.PossibleValues.Count == 0) continue; int count = sp.PossibleValues.Count; for (int k = 0; k < count; ++k) { int keyValue = sp.PossibleValues[k]; result[keyValue] = result.ContainsKey(keyValue) == false ? new CandidateHelper(1, i) : new CandidateHelper(result[keyValue]); } } return FilterUniques(result); }
private SudokuPiece[,] GetArea(int x, int y, int size) { var result = new SudokuPiece[size,size]; int deltaX = size + x; int deltaY = size + y; int ci = 0; for (int i = x; i < deltaX; ++i, ++ci) { int ck = 0; for (int k = y; k < deltaY; ++k, ++ck) { result[ci, ck] = board[i, k]; } } return result; }
public static SudokuPuzzle Create(int[,] board) { if (board == null || board.GetUpperBound(0) != 8 || board.GetUpperBound(1) != 8) { throw new ArgumentException("board"); } int size = board.GetUpperBound(0) + 1; SudokuPiece[,] puzzle = new SudokuPiece[size, size]; for (int i = 0; i < size; ++i) { for (int k = 0; k < size; ++k) { int value = board[i, k]; puzzle[i, k] = new SudokuPiece(value); } } return(new SudokuPuzzle(puzzle)); }
private static IDictionary<int, CandidateHelper> UniquePencilmarks(SudokuPiece[,] p) { Dictionary<int, CandidateHelper> result = new Dictionary<int, CandidateHelper>(); for (int i = 0; i < Slice; ++i) { for (int k = 0; k < Slice; ++k) { SudokuPiece sp = p[k, i]; if (sp.Value != 0 || sp.PossibleValues == null || sp.PossibleValues.Count == 0) { continue; } for (int w = 0; w < sp.PossibleValues.Count; ++w) { int keyValue = sp.PossibleValues[w]; result[keyValue] = result.ContainsKey(keyValue) == false ? new CandidateHelper(1, i, k) : new CandidateHelper(result[keyValue]); } } } return FilterUniques(result); }
private static IDictionary<int, IList<Point>> GetCandidates(SudokuPiece[,] area, int deltaX, int deltaY) { IDictionary<int, IList<Point>> candidates = new Dictionary<int, IList<Point>>(); for (int i = 0; i < Slice; ++i) { for (int k = 0; k < Slice; ++k) { SudokuPiece temp = area[i, k]; if (temp.Value != 0) { continue; } IList<int> pv = temp.PossibleValues; for (int w = 0; w < pv.Count; ++w) { int value = pv[w]; if (candidates.ContainsKey(value) == false) { candidates[value] = new List<Point>(); } candidates[value].Add(new Point(k + deltaX, i + deltaY)); } } } return candidates; }