/* gcc -std=c99 -pthread nreines-threads.c */ #include #include #include #include #include #include #define MAX 16 typedef bool echiquier[MAX][MAX]; // variables globales int cpt = 0; int n; static bool ok (int n, int ligne, int colonne, echiquier e); void nreines (int n, int ligne, echiquier e, int *cpt) { for (int col = 0; col < n; col++) if (ok (n, ligne, col, e)) { if (ligne == n - 1) (*cpt)++; // 1 solution trouvée en plus ! else { e[ligne][col] = true; nreines (n, ligne + 1, e, cpt); e[ligne][col] = false; } } } static bool ok (int n, int ligne, int colonne, echiquier e) { int l, c; for (l = 0; l < ligne; l++) if (e[l][colonne]) return false; for (l = ligne - 1, c = colonne - 1; l >= 0 && c >= 0; l--, c--) if (e[l][c]) return false; for (l = ligne - 1, c = colonne + 1; l >= 0 && c <= n; l--, c++) if (e[l][c]) return false; return true; } void usage (char *s) { fprintf (stderr, "%s entier", s); exit (EXIT_FAILURE); } void * start(void * arg) { size_t i = (size_t)arg; echiquier e; // ne doit pas être globale ! memset (e, 0, sizeof (e)); e[0][i] = true; // on place la première reine sur la ligne 0, ième colonne nreines (n, 1, e, &cpt); // on explore à partir de la ligne 1 } int main (int argc, char *argv[]) { if (argc < 2) usage (argv[0]); n = atoi(argv[1]); pthread_t tids[n]; assert(n > 0); assert(sizeof(size_t) == sizeof(void*)); for(size_t i = 0; i