public ISudokuRegion GetRegionByValuePosition(ISudokuPosition position) { int regionRow = position.RowNumber / Size; int regionCol = position.ColumnNumber / Size; ISudokuPosition regionPosition = new SudokuPosition(regionRow, regionCol); return GetRegion(regionPosition); }
protected override int GetNextPossibleValue(ISudokuPosition position) { if (position == currentPosition) { currentValue++; } else { currentPosition = position; currentValue = 1; } return currentValue; }
private void InitializeRegion(ISudokuPuzzle puzzle, ISudokuPosition position) { ISudokuPosition currentPosition = new SudokuPosition(); board = new SimpleSudokuBoard(puzzle.Size); for (int i = 0; i < puzzle.Size; i++) { for (int j = 0; j < puzzle.Size; j++) { currentPosition.RowNumber = puzzle.Size * position.RowNumber + i; currentPosition.ColumnNumber = puzzle.Size * position.ColumnNumber + j; board.SetValue(i, j, puzzle.GetValue(currentPosition)); } } }
private IValueCyclableCollection CreateValueCyclableCollection(ISudokuPosition position) { ValueCyclableCollection collection = new ValueCyclableCollection(); int squareSize = Puzzle.Size * Puzzle.Size; for (int i = 1; i <= squareSize; i++) { if (!ValueExistsInRow(position, i) && !ValueExistsInColumn(position, i) && !ValueExistsInRegion(position, i)) { collection.Add(i); } } return collection; }
private bool ValueExistsInColumn(ISudokuPosition position, int value) { int squareSize = Puzzle.Size * Puzzle.Size; ISudokuPosition currentPosition = new SudokuPosition(); currentPosition.ColumnNumber = position.ColumnNumber; for (int i = 0; i < squareSize; i++) { currentPosition.RowNumber= i; if (Puzzle.GetValue(currentPosition) == value) { return true; } } return false; }
public int GetValue(ISudokuPosition position) { return board[position.RowNumber, position.ColumnNumber]; }
public ISudokuRegion GetRegion(ISudokuPosition position) { return new SudokuRegion(this, position); }
public abstract int GetNextValue(ISudokuPosition position);
public override int GetNextValue(ISudokuPosition position) { return valuesTable[position].GetNextValue(); }
private void DoSetValue(ISudokuPosition position, int value) { board[position.RowNumber, position.ColumnNumber] = value; }
protected abstract int GetNextPossibleValue(ISudokuPosition position);
bool ISudokuRegion.SetValue(ISudokuPosition position, int value) { return board.SetValue(position.RowNumber, position.ColumnNumber, value); }
int ISudokuRegion.GetValue(ISudokuPosition position) { return board[position.RowNumber, position.ColumnNumber]; }
public SudokuRegion(ISudokuPuzzle puzzle, ISudokuPosition position) { InitializeRegion(puzzle, position); }
public bool SetValue(ISudokuPosition position, int value) { if (ValidatePosition(position, value)) { DoSetValue(position, value); return true; } else { return false; } }
private bool ValueExistsInRegion(ISudokuPosition position, int value) { ISudokuRegion region = Puzzle.GetRegionByValuePosition(position); ISudokuPosition currentPosition = new SudokuPosition(); for (int i = 0; i < region.Size; i++) { currentPosition.RowNumber = i; for (int j = 0; j < region.Size; j++) { currentPosition.ColumnNumber = j; if (region.GetValue(currentPosition) == value) { return true; } } } return false; }
private bool ValidatePosition(ISudokuPosition position, int value) { return (ValidatePositionRow(position, value) && ValidatePositionColumn(position, value) && ValidatePositionRegion(position, value)); }
public override void ResetCycle(ISudokuPosition position) { valuesTable[position].ResetCycle(); }
private bool ValidatePositionColumn(ISudokuPosition position, int value) { int col = position.ColumnNumber; for (int i = 0; i < SquareSize; i++) { if (board[i, col] == value) { return false; } } return true; }
private bool ValidatePositionRow(ISudokuPosition position, int value) { int row = position.RowNumber; for (int i = 0; i < SquareSize; i++) { if (board[row, i] == value) { return false; } } return true; }
public bool ClearValue(ISudokuPosition position) { return board.ClearValue(position.RowNumber, position.ColumnNumber); }
public abstract void ResetCycle(ISudokuPosition position);
public SimpleBruteForceSudokuStrategy2() { currentPosition = null; currentValue = 1; }