From 213eff32557eecdd5b643d3c0567500755b99c8e Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Fri, 10 May 2019 17:00:55 +0200 Subject: [PATCH] rate pour l'opti qui ralenti mais find_place divisee avec fit_in_place --- .search_map.c.swn | Bin 0 -> 16384 bytes search_map.c | 88 +++++++++++++++++++++++++--------------------- 2 files changed, 48 insertions(+), 40 deletions(-) create mode 100644 .search_map.c.swn diff --git a/.search_map.c.swn b/.search_map.c.swn new file mode 100644 index 0000000000000000000000000000000000000000..0dee589a44d9a36b7a9fac698715f4b83b33cbd6 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/search_map.c b/search_map.c index 3805c1a..b69c5dd 100644 --- a/search_map.c +++ b/search_map.c @@ -6,49 +6,52 @@ /* By: hulamy +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/27 20:47:22 by hulamy #+# #+# */ -/* Updated: 2019/05/09 18:03:46 by hulamy ### ########.fr */ +/* Updated: 2019/05/10 17:00:08 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ #include "fillit.h" +/* +** function that look if a tretri fit in a place +*/ + +unsigned int fit_in_place(unsigned int *map, t_fillist *list, int size, int pos) +{ + unsigned int tmp; + unsigned int mask; + int j; + + mask = ~0u << (32 - list->width); // creer un mask avec les size bits de gauche a 1 (ex: 11111110000000000000000000000000) + j = (list->height - 1) * size + pos; + tmp = 0; + while (j >= pos) + { + tmp >>= list->width; + tmp |= (mask & (map[j / 32] << j)); + tmp |= (mask & (map[(j + list->width) / 32] >> (32 - j))); + j -= size; + } + if (!((tmp >> 16) & list->tetribit)) + return (pos + 1); + return (0); +} + /* ** function that look for the first place in the map for a tetri */ int find_place(unsigned int *tab, t_fillist *list, int size, int pos) { - int i; - int j; - unsigned int mask; - unsigned int tmp; - - // creer un mask avec les size bits de gauche a 1 (ex: 11111110000000000000000000000000) - mask = ~0u << (32 - list->width); - tmp = mask; - i = pos; // boucle jusqu'a la dernier place pour le tetri dans la map ou qu'il fit dans un trou - while (i < (size - list->height + 1) * size) + while (pos < (size - list->height + 1) * size) { // pour ne pas deborder a droite de la map - if (i % size == size - list->width + 1) - i += list->width - 1; - else - { - tmp = 0; - // construit un tmp qui est une photo de la map de la taille du tetri a un emplacement donne - j = (list->height - 1) * size + i; - while (j >= i) - { - tmp >>= list->width; - tmp |= (mask & (tab[j / 32] << j)); - tmp |= (mask & (tab[(j + list->width) / 32] >> (32 - j))); - j -= size; - } - if (!((tmp >> 16) & list->tetribit)) - return (i + 1); - i++; - } + if (pos % size == size - list->width + 1) + pos += list->width - 2; + else if (fit_in_place(tab, list, size, pos)) + return (pos + 1); + pos++; } return (0); } @@ -79,6 +82,11 @@ void add_remove(unsigned int *map, t_fillist *list, int size, int pos) } } +/* +** function that try to optimize the speed +** TOTAL FAILURE :p +*/ + int check_others(unsigned int *map, t_fillist *list, int size, int num) { t_fillist *tmp; @@ -87,7 +95,7 @@ int check_others(unsigned int *map, t_fillist *list, int size, int num) int i; int j; - dot = 0; + dots = 0; i = -1; num *= 4; total = size * size; @@ -95,27 +103,27 @@ int check_others(unsigned int *map, t_fillist *list, int size, int num) { tmp = list->next; j = 1; - while (verifier si i est un point) + // saute les position pas vides + while (1 << (i % 32) & map[i % 32]) i++; + // pour chaque position vide regarde si chaque tetri non encode places peuvent y rentrer while (j && tmp) { - // si le tetri est trop a droite ou trop en bas il ne rentre pas ce n'est pas la peine de charcher + // si le tetri est trop a droite ou trop en bas il ne rentre pas ce n'est pas la peine de chercher donc on passe au tetri suivant if (tmp->width > (size - i % size) || (total - i) <= (tmp->height * size)) tmp = tmp->next; - else if (tmp->tetribit ne rentre pas dans la place i) + // sinon verifier si on peut le mettre a cette position et si on ne peut pas passer au tetri suivant + else if (!fit_in_place(map, list, size, i)) tmp = tmp->next; + // si le tetri peut rentrer on arrete la boucle en mettant j = 0 else j = 0; } + // si j existe c que le tetri ne pouvait pas etre place donc on rajoute 1 au compteur de point isoles if (j) dots++; } - // verifie que les tetri restant puissent un par un se placer sur la map - // ca n'optimise qu'en fin de map donc ca ralentit les grosses map en fait -// while ((tmp = tmp->next)) -// if (!find_place(map, tmp, size, 0)) -// return (0); - return (1); + return (dots > total - num); } /* @@ -134,7 +142,7 @@ int fill_map(unsigned int *map, t_fillist *list, int size, int num, t_fillist * { add_remove(map, list, size, pos); list->position = pos; - print_final_map(link, size); ft_putnbrendl(pos); print_map(map, size, size, '#'); ft_putchar('\n'); // DEBUG +// print_final_map(link, size); ft_putnbrendl(pos); print_map(map, size, size, '#'); ft_putchar('\n'); // DEBUG if (check_others(map, list, size, num) && fill_map(map, list->next, size, num, link)) return (1); add_remove(map, list, size, pos);