コード例 #1
0
ファイル: ft_filling.c プロジェクト: ifillitgood/FILLIT
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);
}
コード例 #2
0
ファイル: ft_path_finding.c プロジェクト: anasse82/lem-in
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);
}
コード例 #3
0
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); 
}