diff --git a/fillit.h b/fillit.h index 413f2c0..3983144 100644 --- a/fillit.h +++ b/fillit.h @@ -6,7 +6,7 @@ /* By: vmanzoni +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/01 13:34:46 by vmanzoni #+# #+# */ -/* Updated: 2019/05/16 15:31:15 by hulamy ### ########.fr */ +/* Updated: 2019/05/17 15:33:01 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,6 +44,10 @@ typedef struct s_fillist int width; int height; int position; + int posx; + int int_number; + int pos_in_int; + int limit; int test; char letter; struct s_fillist *next; diff --git a/parse_input.c b/parse_input.c index 7ee2852..6b527a4 100644 --- a/parse_input.c +++ b/parse_input.c @@ -6,7 +6,7 @@ /* By: vmanzoni +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 14:48:14 by vmanzoni #+# #+# */ -/* Updated: 2019/05/16 15:30:57 by hulamy ### ########.fr */ +/* Updated: 2019/05/17 15:32:59 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -89,8 +89,6 @@ void fill_list(char line[], t_fillist *list) list->height = i; // fabrique la ligne pour le tetriminos de la bonne largeur list->tetribit = reduce_tetri(list->tetribit, list->width); - list->position = 0; - list->test = 0; // DEBUG pour que print_final_map puisse imprimer correctement au fur et a mesure } /* diff --git a/search_map.c b/search_map.c index 7009f04..6b59070 100644 --- a/search_map.c +++ b/search_map.c @@ -6,7 +6,7 @@ /* By: hulamy +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/27 20:47:22 by hulamy #+# #+# */ -/* Updated: 2019/05/16 16:50:29 by hulamy ### ########.fr */ +/* Updated: 2019/05/17 15:55:04 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,12 +16,16 @@ ** function that look if a tretri fit in a place */ -unsigned int fit_in_place(unsigned int *map, t_fillist *list, int size, int n, int r) +unsigned int fit_in_place(unsigned int *map, t_fillist *list, int size) { unsigned int tmp; unsigned int mask; int i; + int n; + int r; + n = list->int_number; + r = list->pos_in_int; unsigned int tetri; i = list->height; tetri = list->tetribit << 16 >> list->width; @@ -40,42 +44,6 @@ unsigned int fit_in_place(unsigned int *map, t_fillist *list, int size, int n, i return (!(tmp & tetri)); } -/* -** 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 place; // designe la position sur la ligne du tableau de size*size - int r; // designe la position de pos dans l'int du tableau - int n; // designe dans quel int tu tableau pos se trouve - int limit; // limit en hauteur du tableau a chercher pour la position du tetri - int pos; - - pos = list->position; - place = pos % size; - r = pos % 32; - n = pos / 32; - limit = (size - list->height + 1) * size; - while (pos < limit) - { - if (r >= 32 && ++n) - r -= 32; - if (place > size - list->width && (place = -1)) - { - pos += list->width - 2; - r += list->width - 2; - } - else if (fit_in_place(tab, list, size, n, r)) - return ((list->position = pos + 1)); -// return (pos + 1); - pos++; - place++; - r++; - } - return (0); -} - /* ** function that add or remove a tetri on the map */ @@ -101,51 +69,59 @@ void add_remove(unsigned int *map, t_fillist *list, int size) } } +/* +** function that look for the first place in the map for a tetri +*/ + +int find_place(unsigned int *tab, t_fillist *list, int size) +{ + t_fillist tmp; + + + tmp = *list; + while (list->position < list->limit) + { + if (list->pos_in_int >= 32 && ++list->int_number) + list->pos_in_int -= 32; + if (list->posx > size - list->width && (list->posx = -1)) + { + list->position += list->width - 2; + list->pos_in_int += list->width - 2; + } + else if (fit_in_place(tab, list, size)) + { + list->pos_in_int++; + list->position++; + list->posx++; + return (1); + } + list->position++; + list->posx++; + list->pos_in_int++; + } + list = &tmp; + return (0); +} + /* ** function that recursively try to fill the map with the tetris */ int fill_map(unsigned int *map, t_fillist *list, int size, t_fillist *link) // DEBUG link sert uniquement pour afficher le debug { -// /* -// int posx; -// int posy; - -// posx = list->posx; -// posy = list->posy; if (!list) return (1); - list->position = 0; // comme les positions sont marquees en dure dans la liste et non plus dans une petite variable - // au sein de la fonction, il faut remettre a zero la position a chaque nouveau tour de map + list->position = 0; + list->int_number = 0; + list->pos_in_int = 0; + list->posx = 0; while (find_place(map, list, size)) { -// pos = list->position; -// list->test = 1; // DEBUG pour afficher la map a chaque etape add_remove(map, list, size); -// print_final_map(link, size); ft_putnbrendl(pos); print_map(map, size, size, '#'); ft_putchar('\n'); // DEBUG if (fill_map(map, list->next, size, link)) return (1); add_remove(map, list, size); -// list->test = 0; // DEBUG pour afficher la map a chaque etape } -// */ - - /* - int pos; - - pos = 0; - if (!list) - return (1); - while ((pos = find_place(map, list, size, pos))) - { - add_remove(map, list, size, pos); - list->position = pos; - if (fill_map(map, list->next, size, link)) - return (1); - add_remove(map, list, size, pos); - } - */ - return (0); } @@ -165,6 +141,26 @@ unsigned int *init_map(int i) return (new); } +/* +** function that init the list with the new values for each map size +*/ + +void init_list(t_fillist *list, int size) +{ + t_fillist *tmp; + + tmp = list; + while (tmp) + { + list->posx = 0; + list->int_number = 0; + list->pos_in_int = 0; + list->test = 0; // DEBUG pour que print_final_map puisse imprimer correctement au fur et a mesure + tmp->limit = (size - tmp->height + 1) * size; + tmp = tmp->next; + } +} + /* ** function that send to "fill_map" a map of a certain size and increment its size untill it's solved */ @@ -172,7 +168,6 @@ unsigned int *init_map(int i) void search_map(t_fillist *list) { t_fillist *tmp; - unsigned int *map; int size; int num; @@ -180,16 +175,12 @@ void search_map(t_fillist *list) size = 2; num = 1; tmp = list; - // trouve le nombre de tetri en parcourant la liste chainee - while ((tmp = tmp->next)) + while ((tmp = tmp->next)) // trouve le nombre de tetri en parcourant la liste chainee num++; - // trouve la taille minimale de la map - while (size * size < num * 4) + while (size * size < num * 4) // trouve la taille minimale de la map size++; - map = init_map(size); - - + //////////////////////////////////////// TEST unsigned int print; tmp = list; while (tmp) @@ -201,11 +192,15 @@ void search_map(t_fillist *list) ft_putchar('\n'); tmp = tmp->next; } + //////////////////////////////////////// TEST - - // lance la recursive fill_map en augmentant la taille de la map tant qu'il n'y a pas de solution + map = init_map(size); + init_list(list, size); while (!fill_map(map, list, size, list)) + { map = init_map(size++); + init_list(list, size); + } print_final_map(list, size); // DEBUG print_map(map, size, size, '#'); // DEBUG }