public bool ImproveSingleNumberAssignment(Board inBoard, BoardConstraints inConstraints) { if (isFull()) return false; int possibleAssisgnmentsCount = 0; List<CellConstraint> cellAssignments = new List<CellConstraint>(); List<int> numberAssignments = new List<int>(); CellConstraint aPossibleAssignment = null, aCell; foreach (int numberValue in mAllowedValues.Keys) { possibleAssisgnmentsCount = 0; for (int i = 0; i < 9; ++i) { aCell = GetCellFromIndex(inConstraints, i); if (inBoard.IsAvailable(aCell.GetColumn(), aCell.GetRow()) && aCell.CanAssignValue(numberValue)) { ++possibleAssisgnmentsCount; aPossibleAssignment = aCell; } } if (1 == possibleAssisgnmentsCount) { cellAssignments.Add(aPossibleAssignment); numberAssignments.Add(numberValue); } } for (int i = 0; i < cellAssignments.Count; ++i) { inConstraints.AssignValueToCell( cellAssignments[i].GetColumn(), cellAssignments[i].GetRow(), numberAssignments[i] ); } return (cellAssignments.Count > 0); }
private int SearchSollutionWithBackTracking( Board inBoard, BoardConstraints inConstraints, GuessesGeneration inGuessesGeneration ) { bool foundGoodGuess = false; BoardConstraints pendingConstraints = new BoardConstraints(); Board pendingBoard = new Board(); List<GuessGroup> guesses; int status = 1; if(mAbort || (DepthLimit == mDepth)) return status; ++mDepth; MaxReachedDepth = (MaxReachedDepth > mDepth ? MaxReachedDepth : mDepth); guesses = inGuessesGeneration.GetListOfGuesses(inConstraints); foreach (GuessGroup guessGroup in guesses) { if(mAbort) break; foreach(Assignment guess in guessGroup.Guesses) { if (mAbort) break; ++TotalTriedGuesses; pendingBoard.Assign(inBoard); pendingConstraints.Assign(inConstraints, pendingBoard); pendingConstraints.AssignValueToCell(guess); if (SearchSollution(pendingBoard, pendingConstraints, inGuessesGeneration) == 0) { foundGoodGuess = true; break; } else ++TotalFailedGuesses; } if(foundGoodGuess) { inBoard.Assign(pendingBoard); inConstraints.Assign(pendingConstraints,inBoard); status = 0; break; } } --mDepth; return status; }