42-archive/fillit/src/fillit_blobs.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));
}