/ push_swap / push_swap / so_find_index.c
so_find_index.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   so_find_index.c                                    :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/11/29 11:46:41 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/12/07 20:42:53 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "push_swap.h"
14  
15  static int	find_best_index_max(t_deque *deque, int data)
16  {
17  	int	d_index;
18  	int	u_index;
19  
20  	d_index = check_downward(deque, data) + 1;
21  	u_index = check_upward(deque, data);
22  	if (d_index < u_index)
23  		return (d_index);
24  	else
25  		return (u_index * -1);
26  }
27  
28  int	find_best_index_min_mid(t_deque *deque, int data)
29  {
30  	int	d_index;
31  	int	u_index;
32  
33  	d_index = check_downward(deque, data);
34  	u_index = check_upward(deque, data) + 1;
35  	if (d_index < u_index)
36  		return (d_index);
37  	else
38  		return (u_index * -1);
39  }
40  
41  static int	find_deque_a_index(t_deque *deque_a, t_list *node)
42  {
43  	int	data;
44  
45  	if (node->data > deque_max_data(deque_a))
46  	{
47  		data = deque_max_data(deque_a);
48  		return (find_best_index_max(deque_a, data));
49  	}
50  	else if (node->data < deque_min_data(deque_a))
51  	{
52  		data = deque_min_data(deque_a);
53  		return (find_best_index_min_mid(deque_a, data));
54  	}
55  	else
56  	{
57  		data = deque_mid_data(deque_a, node->data);
58  		return (find_best_index_min_mid(deque_a, data));
59  	}
60  }
61  
62  static int	ps_abs(int n)
63  {
64  	if (n < 0)
65  		return (n * -1);
66  	return (n);
67  }
68  
69  void	find_index(t_deque *deque_a, t_deque *deque_b, int *ia, int *ib)
70  {
71  	int		i;
72  	int		a_idx;
73  	int		b_idx;
74  	t_list	*node;
75  
76  	i = 0;
77  	node = deque_b->head;
78  	while (i < deque_b->size)
79  	{
80  		a_idx = find_deque_a_index(deque_a, node);
81  		b_idx = i;
82  		if (i >= (deque_b->size) / 2)
83  			b_idx = (deque_b->size - i) * -1;
84  		if (i == 0 || ps_abs(*ia) + ps_abs(*ib) > ps_abs(a_idx) + ps_abs(b_idx))
85  		{
86  			*ia = a_idx;
87  			*ib = b_idx;
88  		}
89  		node = node->next;
90  		i++;
91  	}
92  }