121 lines
2.5 KiB
C
121 lines
2.5 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* sort_2.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: lfirmin <lfirmin@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2024/11/03 11:40:53 by lfirmin #+# #+# */
|
|
/* Updated: 2024/11/03 18:10:08 by lfirmin ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../include/pushswap.h"
|
|
|
|
void make_move(t_stack *stack_a, t_stack *stack_b, int cheap_ind)
|
|
{
|
|
int move[3];
|
|
int value_b;
|
|
int index_a;
|
|
|
|
move[1] = calc_move_stack_2(stack_b, cheap_ind);
|
|
value_b = return_value(stack_b, cheap_ind);
|
|
index_a = calc_index_a(stack_a, value_b);
|
|
move[0] = calc_move_stack_2(stack_a, index_a);
|
|
move[2] = 0;
|
|
opti(move);
|
|
make_move_b(stack_b, move[1]);
|
|
make_move_a(stack_a, move[0]);
|
|
make_move_r(stack_b, stack_a, move[2]);
|
|
push(stack_b, stack_a);
|
|
ft_printf_fd(1, "pa\n");
|
|
}
|
|
|
|
void make_move_a(t_stack *stack_a, int move)
|
|
{
|
|
if (move > 0)
|
|
{
|
|
while (move != 0)
|
|
{
|
|
rotate(stack_a);
|
|
ft_printf_fd(1, "ra\n");
|
|
move--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (move != 0)
|
|
{
|
|
rrotate(stack_a);
|
|
ft_printf_fd(1, "rra\n");
|
|
move++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void make_move_b(t_stack *stack_b, int move)
|
|
{
|
|
if (move > 0)
|
|
{
|
|
while (move != 0)
|
|
{
|
|
rotate(stack_b);
|
|
ft_printf_fd(1, "rb\n");
|
|
move--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (move != 0)
|
|
{
|
|
rrotate(stack_b);
|
|
ft_printf_fd(1, "rrb\n");
|
|
move++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void make_move_r(t_stack *stack_b, t_stack *stack_a, int move)
|
|
{
|
|
if (move > 0)
|
|
{
|
|
while (move != 0)
|
|
{
|
|
rotate(stack_b);
|
|
rotate(stack_a);
|
|
ft_printf_fd(1, "rr\n");
|
|
move--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (move != 0)
|
|
{
|
|
rrotate(stack_b);
|
|
rrotate(stack_a);
|
|
ft_printf_fd(1, "rrr\n");
|
|
move++;
|
|
}
|
|
}
|
|
}
|
|
|
|
int calc_move_stack_2(t_stack *stack, int index)
|
|
{
|
|
t_node *curr;
|
|
int i;
|
|
int ind;
|
|
|
|
ind = index;
|
|
curr = stack->top;
|
|
while (ind > 1)
|
|
{
|
|
curr = curr->next;
|
|
ind--;
|
|
}
|
|
if (index - 1 < stack->size - index + 1)
|
|
i = index - 1;
|
|
else
|
|
i = (stack->size - index + 1) * -1;
|
|
return (i);
|
|
}
|