void solve_parallel(int x, int y, CSudokuBoard* sudoku, CSudokuBoard*
& solution) { if (x == sudoku->getFieldSize()) { // end of line y++; x = 0; if(y == sudoku->getFieldSize()) // end return true; }
if (sudoku->get(y, x) > 0) { // field already set return solve_parallel(x+1, y, sudoku); // tackle next field }
for (int i = 1; i <= sudoku->getFieldSize(); i++) { // try all numbers if (!sudoku->check(x, y, i)) { #pragma omp task firstprivate(i,x,y,sudoku) { CSudokuBoard* new_sudoku = new CSudokuBoard(*sudoku); new_sudoku->set(y, x, i); // if number fits, set it if (solve_parallel(x+1, y, new_sudoku)) { // tackle next field // remember Sudoku board and stop parallel execution #pragma omp critical if (!solution) { solution = new_sudoku; #pragma omp cancel taskgroup } } delete new_sudoku; } } } #pragma omp taskwait
sudoku->set(y, x, 0); // no solution found, reset field }
(ane)