-
Notifications
You must be signed in to change notification settings - Fork 0
/
resolution.c
108 lines (95 loc) · 2.61 KB
/
resolution.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* resolution.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ybitton <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/12 13:17:37 by ybitton #+# #+# */
/* Updated: 2017/01/16 16:41:09 by ybitton ### ########.fr */
/* */
/* ************************************************************************** */
#include "fillit.h"
/*
** Cette fonction va calculer le nbr de piece mais avec la racine
** carrer ce qui va nous aider a trouver la taille de la map
** elle retourne la taille.
*/
int resolution_part1(int n)
{
int size;
size = 2;
while (size * size < n)
size++;
return (size);
}
/*
** Cette fonction est une fonction de la libft qui permet
** de conte le nombre de block dan sune liste
*/
size_t ft_count_list(t_list *lst)
{
size_t i;
i = 0;
while (lst != NULL)
{
lst = lst->next;
i++;
}
return (i);
}
/*
** Cette fonction est une fonction backtrack qui va utiliser
** la recursiviter pour verifier l'endroit le plus optimiser
** pour cahque piece de la liste. elle appelle plusieurs fonctions
** qui verifie l'emplecement est bon.
** elle retourne 1 si ses bon ou 0 pour un fail
*/
int resolve_map(t_map *map, t_list *list)
{
int x;
int y;
t_etris *tetris;
if (list == NULL)
return (1);
y = 0;
tetris = (t_etris *)(list->content);
while (y < map->size - tetris->height + 1)
{
x = 0;
while (x < map->size - tetris->width + 1)
{
if (put_in_map(tetris, map, x, y))
{
if (resolve_map(map, list->next))
return (1);
else
in_good_place(tetris, map, point_creat_list(x, y), '.');
}
x++;
}
y++;
}
return (0);
}
/*
** Cette fonction resoudre le fillit
** elle fait appelle a plusieurs fonctions
** a la elle retourne la map avec les bon emplacement
** de chaque piece remplacer avec la lettre alphabetique
** a laquel elle correspond.
*/
t_map *resolution(t_list *list)
{
t_map *map;
int size;
size = resolution_part1(ft_count_list(list) * 4);
map = map_list_creat(size);
while (!resolve_map(map, list))
{
size++;
free_map_list(map);
map = map_list_creat(size);
}
return (map);
}