125 lines
2.5 KiB
C
125 lines
2.5 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* optimise_move.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2022/01/15 23:50:43 by apommier #+# #+# */
|
|
/* Updated: 2022/01/17 14:09:26 by apommier ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include"push_swap.h"
|
|
|
|
int ft_strcmp(const char *s1, t_slist *str)
|
|
{
|
|
int i;
|
|
char *s2;
|
|
|
|
if (!str)
|
|
return (1);
|
|
s2 = (char *)str->action;
|
|
i = 0;
|
|
if (s2)
|
|
{
|
|
while (s1[i] || s2[i])
|
|
{
|
|
if (s1[i] != s2[i])
|
|
{
|
|
return ((unsigned char)s1[i] - (unsigned char)s2[i]);
|
|
}
|
|
i++;
|
|
}
|
|
return (0);
|
|
}
|
|
return (1);
|
|
}
|
|
|
|
void cut_lst(t_slist *lst)
|
|
{
|
|
t_slist *save;
|
|
|
|
save = 0;
|
|
if (!lst)
|
|
return ;
|
|
if (lst->next)
|
|
{
|
|
save = lst->next->next;
|
|
lst->next->next = 0;
|
|
if (lst->next)
|
|
free(lst->next);
|
|
lst->next = save;
|
|
}
|
|
}
|
|
|
|
t_slist *transform_list(t_slist *start, t_slist *start2, int r1, int r2)
|
|
{
|
|
t_slist *type;
|
|
|
|
type = start;
|
|
if (r2 < r1)
|
|
{
|
|
while (r2--)
|
|
{
|
|
cut_lst(start2);
|
|
start->action = "rr";
|
|
start = start->next;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (r1--)
|
|
{
|
|
cut_lst(start2);
|
|
start->action = "rr";
|
|
start = start->next;
|
|
}
|
|
}
|
|
return (type);
|
|
}
|
|
|
|
t_slist *sequence(t_slist *lst, t_slist *start1, t_slist *start2, int r1)
|
|
{
|
|
char *type;
|
|
int r2;
|
|
|
|
type = 0;
|
|
r2 = 0;
|
|
if (!ft_strcmp("ra", lst) || !ft_strcmp("rb", lst))
|
|
{
|
|
type = lst->action;
|
|
while (!ft_strcmp(type, lst) && r2++ >= 0)
|
|
lst = lst->next;
|
|
lst = transform_list(start1, start2, r1, r2);
|
|
}
|
|
return (lst);
|
|
}
|
|
|
|
void optimise_move(t_slist **action, t_slist *start2, int r1)
|
|
{
|
|
t_slist *start1;
|
|
t_slist *lst;
|
|
char *type;
|
|
|
|
type = 0;
|
|
lst = *action;
|
|
while (lst)
|
|
{
|
|
r1 = 0;
|
|
if (!ft_strcmp("ra", lst) || !ft_strcmp("rb", lst))
|
|
{
|
|
start1 = lst;
|
|
type = lst->action;
|
|
while (!ft_strcmp(type, lst) && r1++ >= 0)
|
|
{
|
|
start2 = lst;
|
|
lst = lst->next;
|
|
}
|
|
lst = sequence(lst, start1, start2, r1);
|
|
}
|
|
else if (lst)
|
|
lst = lst->next;
|
|
}
|
|
}
|