bool BoardGenerator::handleNakedPairs(int round){ for (int position=0; position<BOARD_SIZE; position++){ int possibilities = countPossibilities(position); if (possibilities == 2){ int row = cellToRow(position); int column = cellToColumn(position); int section = cellToSectionStartCell(position); for (int position2=position; position2<BOARD_SIZE; position2++){ if (position != position2){ int possibilities2 = countPossibilities(position2); if (possibilities2 == 2 && arePossibilitiesSame(position, position2)){ if (row == cellToRow(position2)){ bool doneSomething = false; for (int column2=0; column2<9; column2++){ int position3 = rowColumnToCell(row,column2); if (position3 != position && position3 != position2 && removePossibilitiesInOneFromTwo(position, position3, round)){ doneSomething = true; } } if (doneSomething){ if (recordHistory) addHistoryItem(new LogItem(round, LogItem::NAKED_PAIR_ROW, 0, position)); return true; } } if (column == cellToColumn(position2)){ bool doneSomething = false; for (int row2=0; row2<9; row2++){ int position3 = rowColumnToCell(row2,column); if (position3 != position && position3 != position2 && removePossibilitiesInOneFromTwo(position, position3, round)){ doneSomething = true; } } if (doneSomething){ if (recordHistory) addHistoryItem(new LogItem(round, LogItem::NAKED_PAIR_COLUMN, 0, position)); return true; } } if (section == cellToSectionStartCell(position2)){ bool doneSomething = false; int secStart = cellToSectionStartCell(position); {for (int i=0; i<3; i++){ for (int j=0; j<3; j++){ int position3=secStart+i+(9*j); if (position3 != position && position3 != position2 && removePossibilitiesInOneFromTwo(position, position3, round)){ doneSomething = true; } } }} if (doneSomething){ if (recordHistory) addHistoryItem(new LogItem(round, LogItem::NAKED_PAIR_SECTION, 0, position)); return true; } } } } } } } return false; }
boolean guess(unsigned short* sudoku, int recursionLevel) { if(recursionLevel >= MAX_DEPTH) // max return false; unsigned int cell, numPossibilities; for(cell = 0; cell < 256; cell++) for(numPossibilities = 2; numPossibilities < 16; numPossibilities++) { if(countPossibilities(sudoku[cell]) != numPossibilities) continue; unsigned int bit; for(bit = 0; bit < 16; bit++) { if(!(sudoku[cell] & (1 << bit))) continue; copySudoku(sudoku, sudokuGuess[recursionLevel]); // make a guess sudokuGuess[recursionLevel][cell] &= (1 << bit); guessConflict[recursionLevel] = false; solve(sudokuGuess[recursionLevel], recursionLevel); if(!guessConflict[recursionLevel]) continue; // remove impossible guess from source sudoku sudoku[cell] &= ~(1 << bit); if(recursionLevel <= 0) { printf("Conflict at cell %d for value %c\n", cell, 'A' + bit); } return true; } } return false; }
boolean isFixed(unsigned short value) { return countPossibilities(value) == 1; }