1
我解決N後問題與開放式MP,Nqueens使用OpenMPÇ
(原八個皇后問題包括試圖找到一種方法,將八個皇后在棋盤上,以便沒有王后會攻擊任何其他女王/王后,表達這個問題的另一種方式是在八乘八格上放置八個「任何東西」,以使它們沒有共享一個共同的行,列或對角線)。
如果你看看我試過的代碼使用#pragma omp task
但似乎進入永久循環,你將如何使用solve(int Queens[])
函數中的omp任務?
#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;
}