Push_swap/set_a.c
2022-01-15 23:49:27 +01:00

129 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* set_a.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/01/07 19:14:03 by apommier #+# #+# */
/* Updated: 2022/01/15 23:30:15 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "push_swap.h"
void find_loop_index(t_list *list)
{
t_list *start;
t_list *save;
int loop_size;
int loop_size2;
loop_size2 = 0;
loop_size = 0;
start = list;
while (list)
{
loop_size = find_loop(start, list, 0);
if (loop_size > loop_size2)
{
loop_size2 = loop_size;
save = list;
}
list = list->next;
}
find_loop(start, save, 1);
swap_to_b(start, save, 0, loop_size2);
}
int find_loop(t_list *start, t_list *list, int setswap)
{
int countdown;
int loop_size;
t_list *swap;
loop_size = 0;
swap = list->next;
countdown = ft_lstsize(start) - 1;
while (countdown)
{
if (swap)
{
if (swap->index > list->index)
{
list = swap;
loop_size++;
}
else if (setswap)
swap->swap = 1;
countdown--;
swap = swap->next;
}
else
swap = start;
}
return (loop_size);
}
void swap_to_b(t_list *list, t_list *best, t_list *b, int loop)
{
int swap;
int lst_size;
s_list *action;
action = 0;
lst_size = ft_lstsize(list);
swap = 0;
while (lst_size)
{
ft_sa_sb(&list, &action, 'a', 0);
swap = find_loop(list, best, 0);
if (swap > loop)
{
loop = swap;
s_lstadd_back(&action, new_slist("sa\n"));
}
else
ft_sa_sb(&list, &action, 'a', 0);
if (list->swap)
ft_pb(&list, &b, &action);
else
ft_ra_rb(&list, &action, 'a');
lst_size--;
}
list = swap_to_a(list, b, b, action);
list = turn_list(list, action);
printf_slist(action);
s_lstclear(&action);
}
t_list *turn_list(t_list *a, s_list *action)
{
t_list *start;
int place;
start = a;
place = 0;
while (a->index > 1)
{
a = a->next;
place++;
}
a = start;
//printf("place = %d size = %d\n", place, ft_lstsize(a));
if (place > ft_lstsize(a) / 2 && place > 2)
{
//printf("if\n");
while (ft_lstsize(start) - (place++))
ft_rra_rrb(&start, &action, 'a');
}
else
{
//printf("else\n");
while (place--)
ft_ra_rb(&start, &action, 'a');
}
//printf_list(start);
return (start);
}