Я решаю проблему n Queens с открытым mp,
(Первоначальная проблема восьми королев состояла в том, чтобы попытаться найти способ поместить восемь ферзей на шахматную доску, чтобы ни одна королева не напала на любую другую королеву. Альтернативный способ выразить проблему состоит в том, чтобы поместить восемь «чего-либо» на восьмой сеткой, так что ни один из них не разделяет общую строку, столбец или диагональ.)
Если вы посмотрите на код, который я пытался использовать #pragma omp task
, но, похоже, он заходит в бесконечный цикл, как бы вы использовали задачу omp в функции solve(int Queens[])
?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <omp.h>
#define N 15
#define MAXThreads 2
int solutions;
int put(int Queens[], int row, int column)
{
int i;
//#pragma for schedule(static)
for(i=0; i<row; i++) {
if (Queens[i] == column || abs( Queens[i]-column ) == ( row-i ) )
return -1;
}
Queens[row]=column;
if(row==N-1) {
#pragma omp critical
{
solutions++;
}
}else{
for(i=0; i<N; i++) { // increment row
put(Queens, row+1, i);
}
}
return 0;
}
void solve(int Queens[]) {
int i;
#pragma omp parallel private(Queens) num_threads(MAXThreads)
{
// #pragma omp single
// {
#pragma omp for schedule(static)
for(i=0; i<N; i++) {
// #pragma omp task
put(Queens, 0, i);
// }
}
}
}
int main()
{
int Queens[N];
time_t t0=0, tf=0,t0s=0,tfs=0;
//------------------------------------------
t0 = time(NULL);
//------------------------------------------
//solve_secuencial(Queens);
solve(Queens);
//------------------------------------------
tf = time(NULL);
//------------------------------------------
printf( "# solutions %d time: %f \n",solutions, difftime(tf, t0));
return 0;
}