/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* push_ants.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/06 11:37:56 by tmaze #+# #+# */ /* Updated: 2019/04/11 09:14:45 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "lem_in.h" static void clean_ants(t_ants **ants) { t_ants *it; t_ants *tmp; while (*ants && (*ants)->end) { tmp = *ants; *ants = (*ants)->next; ft_memdel((void**)&tmp); } it = *ants; while (it && it->next) { if (it->next->end) { tmp = it->next; it->next = tmp->next; ft_memdel((void**)&tmp); } else it = it->next; } } static void print_ants(t_lmdata *data, t_ants **ants, char *has_start , t_ind **paths) { t_ants *it; it = *ants; while (it) { ft_printf("L%d-%s", it->nb_ant, get_node(data, it->nb_node)->name); if (get_node_path(paths[it->nb_path], it->nb_node) && get_node_path(paths[it->nb_path], it->nb_node)->next) it->nb_node = get_node_path(paths[it->nb_path] , it->nb_node)->next->index; else it->end = 1; if (it->next) ft_putchar(' '); else ft_putchar('\n'); has_start[it->nb_path] = 0; it = it->next; } clean_ants(ants); } static void init_ants(t_ants **ants, int *ant_c, char *has_start, int nb_paths) { *ants = NULL; ft_bzero(has_start, nb_paths); *ant_c = 2; has_start[0] = 1; } int push_ants(t_lmdata *data, t_ind **paths, int nb_paths) { t_ants *ants; int i; int ant_c; char has_start[nb_paths]; init_ants(&ants, &ant_c, has_start, nb_paths); if (add_ant(&ants, 1, 0, paths) == NULL) return (0); while ((ants || ant_c <= data->nbants) && (i = -1)) { while (++i < nb_paths) if (ant_c <= data->nbants && !has_start[i]) { if (!add_ant(&ants, ant_c, i, paths)) del_ants(&ants); if (!ants) return (0); ant_c++; has_start[i] = 1; } print_ants(data, &ants, has_start, paths); } return (1); }