int ft_filling(t_inv *move, int posi, char (*tab)[SIZE], char (*end)[SIZE]) { if (ft_backtrack(move, posi, tab, end) == 1) { ft_reboot(LTR, SIZE, tab); --LTR; if (posi < (SIZE * SIZE - 1)) return (ft_filling(move, ++posi, tab, end)); else if (ft_onlyp(SIZE, end) == 1 && LTR + 1 == 'A') { ++SIZE; return (ft_fillit(move)); } } else { ft_replacend(SIZE, tab, end); if (posi < (SIZE * SIZE - 1)) { ft_reboot(LTR, SIZE, tab); return (ft_filling(move, ++posi, tab, end)); } } --LTR; ft_reboot(++LTR + 1, SIZE, tab); --T; return (1); }
char ft_backtrack(t_lem_in *ptr) { int i; static char ok = 1; t_lem_in *tmp; i = 0; while (ptr->n_way > i) { tmp = ptr->way[i++]; if (tmp->starttoend == 2) return (0); if (tmp->nw > ptr->nw + 1 || (tmp->nw == 0 && tmp->starttoend != 1)) { tmp->nw = ptr->nw + 1; if (tmp->starttoend != 2) ok = ft_backtrack(tmp); } else if (ok && ptr->n_way == i) ptr->nw = 0; } i = 0; while (ptr->starttoend == 1 && i < ptr->n_way && !ptr->way[i]->nw) ++i; i == ptr->n_way && ptr->starttoend == 1 ? ft_error_lem_in() : 0; return (ok); }
int ft_backtrack(t_cube_lists *cube) { t_list *movs; int stop; if (ft_forbidden_set(cube)) return (-1); if (ft_cube_is_solved(cube)) /** Le backtrack est terminée la solution est contenue dans le cube passé en param **/ return (1); if (cube->node_level > 29) return (0); movs = ft_determine_movs(cube); while (movs && !stop) { ft_cube_lists_rot(cube, ft_list_head(movs)); /** On fait la rot, on ajoute la rot a la liste, on incremente la profondeur du noeud **/ if (!(stop = ft_backtrack(cube))); { ft_cube_lists_rot_del_last(cube); /** On annule le dernier ft_lists_rot **/ movs = ft_list_del_head(movs); /** On supprime la tete de la liste movs **/ } } /** Le backtrack termine sans solution **/ return (stop); }