コード例 #1
0
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;
}
コード例 #2
0
ファイル: sudoku.c プロジェクト: schiermike/algo_puzzles
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;
}
コード例 #3
0
ファイル: sudoku.c プロジェクト: schiermike/algo_puzzles
boolean isFixed(unsigned short value)
{
	return countPossibilities(value) == 1;
}