/// <summary> /// Standard constructor /// </summary> public SudokuSolver(SudokuData problem) : base() { m_Problem = problem ?? throw new ArgumentNullException(nameof(problem)); CoreCreateData(); }
/// <summary> /// Clone /// </summary> public SudokuData Clone() { SudokuData result = new SudokuData() { m_Title = this.m_Title }; for (int i = 0; i < m_Data.Length; ++i) { for (int j = 0; j < m_Data.Length; ++j) { result.m_Data[i][j] = m_Data[i][j]; } } return(result); }
// Core guess private void CoreGuess() { int min = int.MaxValue; int minLine = 0; int minCol = 0; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { List <int> item = m_Data[i][j]; if (item.Count <= 1) { continue; } if (item.Count < min) { min = item.Count; minLine = i; minCol = j; } } } SudokuSolver solver = Clone(); solver.m_Data[minLine][minCol].Remove(m_Data[minLine][minCol][0]); SudokuData solution = solver.Solve(); if (solution.IsValid) { CoreAssign(solver); return; } int v = m_Data[minLine][minCol][0]; m_Data[minLine][minCol].Clear(); m_Data[minLine][minCol].Add(v); }
/// <summary> /// Solve /// </summary> public SudokuData Solve() { CoreSolve(); if (!IsCorrect) { return(new SudokuData()); } SudokuData result = new SudokuData(); for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { result[i, j] = m_Data[i][j][0]; } } return(result); }
/// <summary> /// From string /// </summary> public static SudokuData FromString(String value) { if (String.IsNullOrEmpty(value)) { return(null); } IList <String> lines = value.SplitToLines().ToList(); if (lines.Count < 9) { throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value"); } int count = 0; for (int i = lines.Count - 1; i >= 0; --i) { if (count >= 9) { break; } lines[i] = lines[i].Trim(); if (String.IsNullOrEmpty(lines[i])) { lines.RemoveAt(i); } else { count += 1; } } if (lines.Count < 9) { throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value"); } SudokuData result = new SudokuData(); StringBuilder Sb = new StringBuilder(); for (int i = 0; i < lines.Count - 9; ++i) { if (Sb.Length > 0) { Sb.AppendLine(); } Sb.Append(lines[i]); } result.Title = Sb.ToString(); for (int i = 0; i < 9; ++i) { String line = lines[lines.Count - 9 + i].Replace(" ", ""); if (line.Length > 9) { throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value"); } for (int j = 0; j < line.Length; ++j) { Char Ch = line[j]; if ((Ch >= '0') && (Ch <= '9')) { result.m_Data[i][j] = Ch - '0'; } else if ((Ch == '*') || (Ch == '.') || (Ch == 'x') || (Ch == '?') || (Ch == '_')) { result.m_Data[i][j] = 0; } else { throw new ArgumentException("Wrong format of a Sudoku puzzle.", "value"); } } } return(result); }