From 305a994b4585b738fc31a0e16b88c4d65101fe69 Mon Sep 17 00:00:00 2001 From: pm240836 Date: Mon, 20 Apr 2026 10:52:42 +0000 Subject: [PATCH] --- projetSansGraphique.c | 265 ------------------------------------------ 1 file changed, 265 deletions(-) delete mode 100644 projetSansGraphique.c diff --git a/projetSansGraphique.c b/projetSansGraphique.c deleted file mode 100644 index 02b9ebb..0000000 --- a/projetSansGraphique.c +++ /dev/null @@ -1,265 +0,0 @@ -#include -#include -#include -#include -#include -#include // Pour mesurer le temps d'exécution - -#define GRID_ROWS 8 -#define GRID_COLS 8 -#define BIT(row, col) (1ULL << ((row) * 8 + (col))) - -/* --- PIECES --- */ -#define PIECE_1 (BIT(0,0) | BIT(0,1) | BIT(0,2) | BIT(1,1) | BIT(2,1)) -#define PIECE_2 (BIT(0,1) | BIT(0,2) | BIT(1,0) | BIT(1,1)) -#define PIECE_3 (BIT(0,1) | BIT(0,2) | BIT(1,0) | BIT(1,1) | BIT(1,2)) -#define PIECE_4 (BIT(0,0) | BIT(0,1) | BIT(0,2) | BIT(1,0) | BIT(2,0)) -#define PIECE_5 (BIT(0,0) | BIT(0,1) | BIT(1,0) | BIT(2,0) | BIT(2,1)) -#define PIECE_6 (BIT(0,0) | BIT(1,0) | BIT(2,0) | BIT(3,0) | BIT(3,1)) -#define PIECE_7 (BIT(0,0) | BIT(1,0) | BIT(2,0) | BIT(2,1)) -#define PIECE_8 (BIT(0,0) | BIT(0,1) | BIT(1,1) | BIT(2,1) | BIT(2,2)) -#define PIECE_9 (BIT(0,0) | BIT(0,1) | BIT(1,1) | BIT(1,2) | BIT(1,3)) -#define PIECE_10 (BIT(0,0) | BIT(0,1) | BIT(0,2) | BIT(0,3)) - - -typedef struct { - int largeur; - int hauteur; -} Dimensions; - -// on créer une structure car le pthread create ne peux envoyer qu'une seule variable à un thread et comme doit lui envoyer le plateau actuel la liste des pièces ... -typedef struct { // ducoup on regroupe tout ca dans une seule struct - uint64_t plateau_de_depart; - uint64_t* catalogue; - int id_piece_depart; -} ThreadArgs; - -/* ================================================================= */ -/* FONCTIONS BITBOARD */ -/* ================================================================= */ - -//Générer le plateau avec les bordures -uint64_t genererGrilleDeJeu() { - uint64_t bb = 0; - for (int r = 0; r < GRID_ROWS; r++) bb |= BIT(r, 7); - for (int c = 3; c < 7; c++) bb |= BIT(0, c); - bb |= BIT(6, 0); - bb |= BIT(7, 0); - return bb; -} - -//Calculer les dimensions d'une pièce -Dimensions calculer_dimensions(uint64_t piece) { - Dimensions dim = {0, 0}; - if (piece == 0) return dim; - - int min_col = 8, max_col = -1, min_row = 8, max_row = -1; - for (int r = 0; r < 8; r++) { - for (int c = 0; c < 8; c++) { - if (piece & BIT(r, c)) { - if (c < min_col) min_col = c; - if (c > max_col) max_col = c; - if (r < min_row) min_row = r; - if (r > max_row) max_row = r; - } - } - } - dim.largeur = max_col - min_col + 1; - dim.hauteur = max_row - min_row + 1; - return dim; -} - -//Normaliser (ramener la pièce en haut à gauche) -uint64_t normaliser(uint64_t piece) { - if (piece == 0) return 0; - int min_r = 8, min_c = 8; - - for (int r = 0; r < 8; r++) { - for (int c = 0; c < 8; c++) { - if (piece & BIT(r, c)) { - if (r < min_r) min_r = r; - if (c < min_c) min_c = c; - } - } - } - - uint64_t res = 0; - for (int r = 0; r < 8; r++) { - for (int c = 0; c < 8; c++) { - if (piece & BIT(r, c)) { - res |= BIT(r - min_r, c - min_c); - } - } - } - return res; -} - -//Rotation 90° -uint64_t rotation_90(uint64_t piece) { - uint64_t res = 0; - for (int r = 0; r < 8; r++) { - for (int c = 0; c < 8; c++) { - if (piece & BIT(r, c)) { - res |= BIT(c, 7 - r); - } - } - } - return normaliser(res); -} - -//Miroir -uint64_t miroir_horizontal(uint64_t piece) { - uint64_t res = 0; - for (int r = 0; r < 8; r++) { - for (int c = 0; c < 8; c++) { - if (piece & BIT(r, c)) { - res |= BIT(r, 7 - c); - } - } - } - return normaliser(res); -} - -//Trouver la première case vide -bool trouverPremiereCaseVide(uint64_t plateau, int *r, int *c) { - for (int ligne = 0; ligne < 8; ligne++) { - for (int col = 0; col < 8; col++) { - if ((plateau & BIT(ligne, col)) == 0) { - *r = ligne; - *c = col; - return true; - } - } - } - return false; -} - -//Fonction récursive complète (Backtracking) -void placeAutoPiecerec(uint64_t plateau, uint64_t* catalogue, uint16_t pieces_utilisees, int* nb_solutions, int piece_forcee) { - int r, c; - - //condition d'arret si on a plus de trou (la grille est pleine) dans ce cas la on a trouver une solution - if (!trouverPremiereCaseVide(plateau, &r, &c)) { - (*nb_solutions)++; - return; - } - - int debut_boucle = (piece_forcee == -1) ? 0 : piece_forcee; - int fin_boucle = (piece_forcee == -1) ? 10 : piece_forcee + 1; - - //On essaie de placer toutes les pièces - for (int p_idx = debut_boucle; p_idx < fin_boucle; p_idx++) { - - if (pieces_utilisees & (1 << p_idx)) continue; - - uint64_t piece_active = catalogue[p_idx]; - uint64_t formes_testees[8] = {0}; - - // On fait 8 fois la boucle( 4 fois pour le normal et 4 pour le mirroir ) - for (int i = 0; i < 8; i++) { - - //une fois qu'ona fait les 4 possibilitées de rotation pour la piece on la retourne pour faire la suite - if (i == 4) { - piece_active = miroir_horizontal(catalogue[p_idx]); - } - - bool deja_vue = false; - for (int j = 0; j < i; j++) { - if (formes_testees[j] == piece_active) deja_vue = true; - } - formes_testees[i] = piece_active; - - // Si la forme est nouvelle on essaye de "l'emboiter" - if (!deja_vue) { - Dimensions dim = calculer_dimensions(piece_active); - - for (int dr = 0; dr < dim.hauteur; dr++) { - for (int dc = 0; dc < dim.largeur; dc++) { - - int test_r = r - dr; - int test_c = c - dc; - - if (test_r < 0 || test_c < 0 || test_r + dim.hauteur > 8 || test_c + dim.largeur > 8) continue; - - uint64_t piece_decalee = piece_active << (test_r * 8 + test_c); - - if ((piece_decalee & BIT(r, c)) && ((plateau & piece_decalee) == 0)) { - // on valide et on rapelle la fonction - placeAutoPiecerec(plateau | piece_decalee, catalogue, pieces_utilisees | (1 << p_idx), nb_solutions, -1); - } - } - } - } - // On tourne la pièce de 90° pour la prochaine itération - piece_active = rotation_90(piece_active); - } - } -} - -/* ================================================================= */ -/* FONCTION EXÉCUTÉE PAR CHAQUE THREAD */ -/* ================================================================= */ - -void* fonction_thread(void* arg) { - ThreadArgs* args = (ThreadArgs*)arg; - - int* solutions_locales = malloc(sizeof(int)); - *solutions_locales = 0; - - //Lancer la récursivité avec la pièce attribuée au thread au départ - placeAutoPiecerec(args->plateau_de_depart, args->catalogue, 0, solutions_locales, args->id_piece_depart); - - pthread_exit(solutions_locales); -} - -/* ================================================================= */ -/* PROGRAMME MAIN */ -/* ================================================================= */ - -int main(void) { - // Tableau des 10 pièces - uint64_t catalogue[10] = {PIECE_1, PIECE_2, PIECE_3, PIECE_4, PIECE_5, PIECE_6, PIECE_7, PIECE_8, PIECE_9, PIECE_10}; - - //Généreration du plateau - uint64_t plateau_de_depart = genererGrilleDeJeu(); - - //On bloque les cases qui sont la date (pour ne pas pouvoir mettre de pieces dessus ) avec comme exemple ici lundi 1 janvier - plateau_de_depart |= BIT(0, 0); // "Lun" (Ligne 0, Colonne 0) - plateau_de_depart |= BIT(1, 5); // "1" (Ligne 1, Colonne 5) - plateau_de_depart |= BIT(6, 4); // "Jan" (Ligne 6, Colonne 4) - - printf("Recherche des solutions en cours avec 10 Threads...\n");//tkt juste pour rendre beau - - struct timeval tv1, tv2; - gettimeofday(&tv1, NULL); - - pthread_t threads[10]; - ThreadArgs args[10]; - - // Lancement des 10 threads - for (int i = 0; i < 10; i++) { - args[i].plateau_de_depart = plateau_de_depart; - args[i].catalogue = catalogue; - args[i].id_piece_depart = i; - - pthread_create(&threads[i], NULL, fonction_thread, (void*)&args[i]); - } - - int nb_solutions = 0; - int* resultat_thread; - - // Attente de la fin des threads et récupération des solutions - for (int i = 0; i < 10; i++) { - pthread_join(threads[i], (void**)&resultat_thread); - nb_solutions += *resultat_thread; - free(resultat_thread); - } - - gettimeofday(&tv2, NULL); - double temps_execution = (tv2.tv_sec - tv1.tv_sec) + (tv2.tv_usec - tv1.tv_usec) / 1000000.0; - - printf("Fin de l'execution \n Nombre de combinaisons trouvees : %d\n", nb_solutions); - printf("Temps d'execution avec threads : %.2f secondes\n", temps_execution); - - return 0; -} -- GitLab