109 lines
2.1 KiB
C
109 lines
2.1 KiB
C
#include "fillit.h"
|
|
|
|
int ft_fit_blob(char **board, t_list **amap, t_list *blob, t_list *lttmn, int space)
|
|
{
|
|
t_list *list;
|
|
t_list *new_map;
|
|
t_ttmn *ttmn;
|
|
int size;
|
|
int i;
|
|
|
|
size = ft_strlen(*board);
|
|
while (blob)
|
|
{
|
|
i = *(int*)blob->content;
|
|
list = lttmn;
|
|
while (list)
|
|
{
|
|
ttmn = (t_ttmn *)list->content;
|
|
if (ttmn->placed)
|
|
{
|
|
list = list->next;
|
|
continue ;
|
|
}
|
|
if (ft_board_add(board, *ttmn, i))
|
|
{
|
|
list = list->next;
|
|
continue ;
|
|
}
|
|
ttmn->placed = 1;
|
|
new_map = ft_lstmap(*amap, &ft_id);
|
|
if (ft_solver(board, &new_map, lttmn, space))
|
|
return (1);
|
|
ttmn->placed = 0;
|
|
ft_board_remove(board, ttmn->id);
|
|
list = list->next;
|
|
}
|
|
blob = blob->next;
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
int ft_get_blobs(char **board, t_list **amap, t_list *lttmn, int space)
|
|
{
|
|
t_list *blob;
|
|
t_list *new_map;
|
|
int sup_space = 0;
|
|
int size;
|
|
int blob_size;
|
|
int i;
|
|
|
|
if (!lttmn)
|
|
return (ft_solved(board));
|
|
size = ft_strlen(*board);
|
|
/* new_map = ft_lstmap(*amap, &ft_id); */
|
|
new_map = *amap;
|
|
while (new_map)
|
|
{
|
|
i = *(int *)(new_map)->content;
|
|
/* ft_show_board(board); */
|
|
/* ft_lst_print(new_map, &ft_putnbr); */
|
|
|
|
blob = ft_empty_here(board, size, i);
|
|
if (!blob)
|
|
{
|
|
new_map = new_map->next;
|
|
continue ;
|
|
}
|
|
new_map = new_map->next;
|
|
blob_size = ft_lstsize(blob);
|
|
if (blob_size / 4 == 0)
|
|
{
|
|
space -= blob_size % 4;
|
|
/* ft_putendl("delsub"); */
|
|
/* ft_lst_print(*amap, &ft_putnbr); */
|
|
ft_lst_delsub(amap, blob, &ft_diff, &ft_lst_cfree);
|
|
/* ft_lst_print(blob, &ft_putnbr); */
|
|
/* ft_lst_print(*amap, &ft_putnbr); */
|
|
new_map = *amap;
|
|
/* ft_debug(); */
|
|
if (space + sup_space < 0)
|
|
{
|
|
ft_board_remove(board, '*');
|
|
return (0);
|
|
}
|
|
}
|
|
else if (blob_size / 4 == 1)
|
|
{
|
|
space -= blob_size % 4;
|
|
ft_lst_delsub(amap, blob, &ft_diff, &ft_lst_cfree);
|
|
new_map = *amap;
|
|
if (ft_fit_blob(board, amap, blob, lttmn, space))
|
|
{
|
|
ft_board_remove(board, '*');
|
|
return (1);
|
|
}
|
|
else
|
|
space -= 4;
|
|
}
|
|
else
|
|
sup_space -= blob_size % 4;
|
|
if (space + sup_space < 0)
|
|
{
|
|
ft_board_remove(board, '*');
|
|
return (0);
|
|
}
|
|
}
|
|
ft_board_remove(board, '*');
|
|
return (ft_solver(board, amap, lttmn, space));
|
|
}
|