blobs down to 500ms, validate 400ms in this branch
This commit is contained in:
parent
6cb04a8eba
commit
0a8f6242ab
6 changed files with 259 additions and 84 deletions
|
|
@ -36,11 +36,16 @@ int ft_solved(char **board);
|
||||||
|
|
||||||
int ft_check_blobs(char **board, t_list **amap, t_list *lblob, t_list *lttmn, int space);
|
int ft_check_blobs(char **board, t_list **amap, t_list *lblob, t_list *lttmn, int space);
|
||||||
int ft_get_blobs(char **board, t_list **amap, t_list *lttmn, int space);
|
int ft_get_blobs(char **board, t_list **amap, t_list *lttmn, int space);
|
||||||
|
int ft_fit_blob(char **board, t_list **amap, t_list *blob, t_list *lttmn, int space);
|
||||||
|
|
||||||
t_list *ft_empty_around(char **board, t_list **amap, int size, int i);
|
t_list *ft_empty_around(char **board, int size, int i);
|
||||||
t_list *ft_empty_here(char **board, t_list **amap, int size, int i);
|
t_list *ft_empty_here(char **board, int size, int i);
|
||||||
|
int ft_empty_around2(char **board, int size, int i);
|
||||||
|
int ft_empty_here2(char **board, int size, int i);
|
||||||
|
|
||||||
void ft_map_delttmn(t_list **amap, int anchor, int pos[4][2], int size);
|
void ft_map_delttmn(t_list **amap, int anchor, int pos[4][2], int size);
|
||||||
void ft_map_addttmn(t_list **amap, int anchor, int pos[4][2], int size);
|
void ft_map_addttmn(t_list **amap, int anchor, int pos[4][2], int size);
|
||||||
|
|
||||||
|
void ft_board_replace(char **board, char a, char b);
|
||||||
|
int ft_validate_waste(char **board, t_list **amap, t_list *lttmn, int space);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -45,31 +45,59 @@ int ft_get_blobs(char **board, t_list **amap, t_list *lttmn, int space)
|
||||||
t_list *new_map;
|
t_list *new_map;
|
||||||
int sup_space = 0;
|
int sup_space = 0;
|
||||||
int size;
|
int size;
|
||||||
|
int blob_size;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!lttmn)
|
if (!lttmn)
|
||||||
return (ft_solved(board));
|
return (ft_solved(board));
|
||||||
size = ft_strlen(*board);
|
size = ft_strlen(*board);
|
||||||
new_map = ft_lstmap(*amap, &ft_id);
|
/* new_map = ft_lstmap(*amap, &ft_id); */
|
||||||
|
new_map = *amap;
|
||||||
while (new_map)
|
while (new_map)
|
||||||
{
|
{
|
||||||
i = *(int *)(new_map)->content;
|
i = *(int *)(new_map)->content;
|
||||||
blob = ft_empty_here(board, &new_map, size, i);
|
/* ft_show_board(board); */
|
||||||
ft_board_remove(board, '*');
|
/* ft_lst_print(new_map, &ft_putnbr); */
|
||||||
if (ft_lstsize(blob) / 4 <= 1)
|
|
||||||
|
blob = ft_empty_here(board, size, i);
|
||||||
|
if (!blob)
|
||||||
{
|
{
|
||||||
space -= ft_lstsize(blob) % 4;
|
new_map = new_map->next;
|
||||||
ft_lst_delsub(amap, blob, &ft_diff, &ft_lst_cfree);
|
continue ;
|
||||||
}
|
}
|
||||||
else
|
new_map = new_map->next;
|
||||||
sup_space -= ft_lstsize(blob) % 4;
|
blob_size = ft_lstsize(blob);
|
||||||
if (ft_lstsize(blob) / 4 == 1)
|
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))
|
if (ft_fit_blob(board, amap, blob, lttmn, space))
|
||||||
|
{
|
||||||
|
ft_board_remove(board, '*');
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
space -= 4;
|
space -= 4;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
sup_space -= blob_size % 4;
|
||||||
if (space + sup_space < 0)
|
if (space + sup_space < 0)
|
||||||
{
|
{
|
||||||
ft_board_remove(board, '*');
|
ft_board_remove(board, '*');
|
||||||
|
|
|
||||||
|
|
@ -1,58 +1,61 @@
|
||||||
/* void ft_grow_board(char **board) */
|
/*
|
||||||
/* { */
|
void ft_grow_board(char **board)
|
||||||
/* int i; */
|
{
|
||||||
/* int size; */
|
int i;
|
||||||
|
int size;
|
||||||
|
|
||||||
/* size = ft_strlen(*board); */
|
size = ft_strlen(*board);
|
||||||
/* i = 0; */
|
i = 0;
|
||||||
/* while (++i <= size) */
|
while (++i <= size)
|
||||||
/* { */
|
{
|
||||||
/* board[i][size] = '.'; */
|
board[i][size] = '.';
|
||||||
/* board[size][i] = '.'; */
|
board[size][i] = '.';
|
||||||
/* } */
|
}
|
||||||
/* } */
|
}
|
||||||
|
|
||||||
/* void ft_shrink_board(char **board) */
|
void ft_shrink_board(char **board)
|
||||||
/* { */
|
{
|
||||||
/* int i; */
|
int i;
|
||||||
/* int size; */
|
int size;
|
||||||
|
|
||||||
/* size = ft_strlen(*board); */
|
size = ft_strlen(*board);
|
||||||
/* i = -1; */
|
i = -1;
|
||||||
/* while (++i < size) */
|
while (++i < size)
|
||||||
/* { */
|
{
|
||||||
/* board[i][size - 1] = '\0'; */
|
board[i][size - 1] = '\0';
|
||||||
/* board[size - 1][i] = '\0'; */
|
board[size - 1][i] = '\0';
|
||||||
/* } */
|
}
|
||||||
/* } */
|
}
|
||||||
|
|
||||||
/* int ft_test_fit(char **board, t_ttmn block, int i, int j) */
|
int ft_test_fit(char **board, t_ttmn block, int i, int j)
|
||||||
/* { */
|
{
|
||||||
/* size_t k; */
|
size_t k;
|
||||||
/* int new_size; */
|
int new_size;
|
||||||
/* int size; */
|
int size;
|
||||||
/* int x; */
|
int x;
|
||||||
/* int y; */
|
int y;
|
||||||
|
|
||||||
/* size = ft_strlen(*board); */
|
size = ft_strlen(*board);
|
||||||
/* new_size = size; */
|
new_size = size;
|
||||||
/* k = -1; */
|
k = -1;
|
||||||
/* while (++k < 4) */
|
while (++k < 4)
|
||||||
/* { */
|
{
|
||||||
/* x = (int)j + block.pos[k][1]; */
|
x = (int)j + block.pos[k][1];
|
||||||
/* y = (int)i + block.pos[k][0]; */
|
y = (int)i + block.pos[k][0];
|
||||||
/* if (x < 0 || x < 0) */
|
if (x < 0 || x < 0)
|
||||||
/* return (0); */
|
return (0);
|
||||||
/* if (x > size - 1 || y > size - 1) */
|
if (x > size - 1 || y > size - 1)
|
||||||
/* { */
|
{
|
||||||
/* new_size = MAX(new_size, MAX(x + 1, y + 1)); */
|
new_size = MAX(new_size, MAX(x + 1, y + 1));
|
||||||
/* continue ; */
|
continue ;
|
||||||
/* } */
|
}
|
||||||
/* if (board[y][x] != '.' && board[y][x] != '*') */
|
if (board[y][x] != '.' && board[y][x] != '*')
|
||||||
/* return (0); */
|
return (0);
|
||||||
/* } */
|
}
|
||||||
/* return (0); */
|
return (0);
|
||||||
/* } */
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
/* int ft_check_blobs(char **board, t_list **amap, t_list *lblob, t_list *lttmn, int space) */
|
/* int ft_check_blobs(char **board, t_list **amap, t_list *lblob, t_list *lttmn, int space) */
|
||||||
/* { */
|
/* { */
|
||||||
|
|
@ -60,7 +63,6 @@
|
||||||
/* t_list *new_map; */
|
/* t_list *new_map; */
|
||||||
/* int size; */
|
/* int size; */
|
||||||
|
|
||||||
/* /1* ft_putendl("at start of check_blobs"); *1/ */
|
|
||||||
/* if (!lttmn) */
|
/* if (!lttmn) */
|
||||||
/* return (ft_solved(board)); */
|
/* return (ft_solved(board)); */
|
||||||
/* if (((t_ttmn *)lttmn->content)->placed) */
|
/* if (((t_ttmn *)lttmn->content)->placed) */
|
||||||
|
|
@ -68,17 +70,11 @@
|
||||||
/* fflush(stdout); */
|
/* fflush(stdout); */
|
||||||
/* if (!lblob) */
|
/* if (!lblob) */
|
||||||
/* { */
|
/* { */
|
||||||
/* /1* printf("calling solver, no more blobs\n"); *1/ */
|
|
||||||
/* /1* fflush(stdout); *1/ */
|
|
||||||
/* /1* new_map = ft_lstmap(*amap, &ft_id); *1/ */
|
|
||||||
/* return (ft_solver(board, amap, lttmn, space)); */
|
/* return (ft_solver(board, amap, lttmn, space)); */
|
||||||
/* } */
|
/* } */
|
||||||
/* size = ft_strlen(*board); */
|
/* size = ft_strlen(*board); */
|
||||||
/* blob = *(t_list **)lblob->content; */
|
/* blob = *(t_list **)lblob->content; */
|
||||||
|
|
||||||
/* /1* ft_show_board(board); *1/ */
|
|
||||||
/* /1* ft_lst_print(*amap, &ft_putnbr); *1/ */
|
|
||||||
/* /1* ft_lst_print2(lblob, &ft_putnbr); *1/ */
|
|
||||||
/* if (ft_lstsize(blob) / 4 == 1) */
|
/* if (ft_lstsize(blob) / 4 == 1) */
|
||||||
/* { */
|
/* { */
|
||||||
/* /1* new_map = ft_lstmap(*amap, &ft_id); *1/ */
|
/* /1* new_map = ft_lstmap(*amap, &ft_id); *1/ */
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
int ft_solved(char **board)
|
int ft_solved(char **board)
|
||||||
{
|
{
|
||||||
|
ft_board_remove(board, '*');
|
||||||
g_sol = ft_copy_board(board);
|
g_sol = ft_copy_board(board);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
@ -12,7 +13,6 @@ int ft_solver(char **board, t_list **amap, t_list *lttmn, int space)
|
||||||
int i;
|
int i;
|
||||||
t_ttmn *ttmn;
|
t_ttmn *ttmn;
|
||||||
t_list *map;
|
t_list *map;
|
||||||
t_list *valmap;
|
|
||||||
|
|
||||||
if (!lttmn)
|
if (!lttmn)
|
||||||
return (ft_solved(board));
|
return (ft_solved(board));
|
||||||
|
|
@ -21,6 +21,8 @@ int ft_solver(char **board, t_list **amap, t_list *lttmn, int space)
|
||||||
return (ft_solver(board, amap, lttmn->next, space));
|
return (ft_solver(board, amap, lttmn->next, space));
|
||||||
size = ft_strlen(*board);
|
size = ft_strlen(*board);
|
||||||
map = *amap;
|
map = *amap;
|
||||||
|
/* ft_show_board(board); */
|
||||||
|
/* ft_lst_print(*amap, &ft_putnbr); */
|
||||||
while (map)
|
while (map)
|
||||||
{
|
{
|
||||||
i = *(int *)map->content;
|
i = *(int *)map->content;
|
||||||
|
|
@ -29,10 +31,20 @@ int ft_solver(char **board, t_list **amap, t_list *lttmn, int space)
|
||||||
map = map->next;
|
map = map->next;
|
||||||
continue ;
|
continue ;
|
||||||
}
|
}
|
||||||
valmap = ft_lstmap(*amap, &ft_id);
|
|
||||||
ft_map_delttmn(&valmap, i, ttmn->pos, size);
|
t_list *n_map = ft_lstmap(*amap, &ft_id);
|
||||||
if (ft_get_blobs(board, &valmap, lttmn->next, space))
|
ft_map_delttmn(&n_map, i, ttmn->pos, size);
|
||||||
|
if (ft_get_blobs(board, &n_map, lttmn->next, space))
|
||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
|
/* ft_map_delttmn(amap, i, ttmn->pos, size); */
|
||||||
|
/* if (ft_validate_waste(board, &n_map, lttmn->next, space)) */
|
||||||
|
/* return (1); */
|
||||||
|
if (ft_solver(board, amap, lttmn->next, space))
|
||||||
|
return (1);
|
||||||
|
/* ft_map_addttmn(amap, i, ttmn->pos, size); */
|
||||||
|
/* map = *amap; */
|
||||||
|
|
||||||
ft_board_remove(board, ttmn->id);
|
ft_board_remove(board, ttmn->id);
|
||||||
map = map->next;
|
map = map->next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
108
fillit/src/fillit_validate.c
Normal file
108
fillit/src/fillit_validate.c
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
#include "fillit.h"
|
||||||
|
|
||||||
|
int ft_fit_blob2(char **board, t_list **amap, t_list *lttmn, int i, int blob_size, int space)
|
||||||
|
{
|
||||||
|
t_ttmn *ttmn;
|
||||||
|
t_list *list;
|
||||||
|
int y;
|
||||||
|
int l;
|
||||||
|
int size;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
/* printf("going to fit any at %i,%i\n", i, j); */
|
||||||
|
/* fflush(stdout); */
|
||||||
|
/* ft_show_board(board); */
|
||||||
|
y = i;
|
||||||
|
n = blob_size;
|
||||||
|
size = ft_strlen(*board);
|
||||||
|
while (y < size * size)
|
||||||
|
{
|
||||||
|
if (board[y / size][y % size] == '*')
|
||||||
|
{
|
||||||
|
n--;
|
||||||
|
l = -1;
|
||||||
|
/* printf("0 trying all at %i\n", y); */
|
||||||
|
/* fflush(stdout); */
|
||||||
|
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;
|
||||||
|
if (ft_solver(board, amap, lttmn, space))
|
||||||
|
return (1);
|
||||||
|
ttmn->placed = 0;
|
||||||
|
ft_board_remove(board, ttmn->id);
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
/* printf("failed at %i\n", y); */
|
||||||
|
/* fflush(stdout); */
|
||||||
|
}
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int ft_validate_waste(char **board, t_list **amap, t_list *lttmn, int space)
|
||||||
|
{
|
||||||
|
t_ttmn *ttmn;
|
||||||
|
int waste;
|
||||||
|
int y;
|
||||||
|
t_list *blob;
|
||||||
|
int blob_size;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
if (!lttmn)
|
||||||
|
return (ft_solved(board));
|
||||||
|
ttmn = (t_ttmn *)lttmn->content;
|
||||||
|
if (ttmn->placed)
|
||||||
|
return (ft_solver(board, amap, lttmn->next, space));
|
||||||
|
waste = 0;
|
||||||
|
size = ft_strlen(*board);
|
||||||
|
y = -1;
|
||||||
|
/* ft_show_board(board); */
|
||||||
|
while (++y < size * size)
|
||||||
|
{
|
||||||
|
if (board[y / size][y % size] != '.')
|
||||||
|
continue ;
|
||||||
|
/* blob = ft_empty_here(board, size, y); */
|
||||||
|
/* blob_size = ft_lstsize(blob); */
|
||||||
|
blob_size = ft_empty_here2(board, size, y);
|
||||||
|
/* ft_board_replace(board, '*', '^') */
|
||||||
|
/* printf("found blob=%i at %i\n", blob_size, y); */
|
||||||
|
/* fflush(stdout); */
|
||||||
|
/* ft_show_board(board); */
|
||||||
|
waste += blob_size % 4;
|
||||||
|
if (waste > size * size - 4 * g_ttmn)
|
||||||
|
{
|
||||||
|
ft_board_remove(board, '*');
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (blob_size / 4 == 1)
|
||||||
|
{
|
||||||
|
ft_board_remove(board, '*');
|
||||||
|
blob = ft_empty_here(board, size, y);
|
||||||
|
if (ft_fit_blob2(board, amap, lttmn, y, blob_size, space))
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
waste += (blob_size / 4 == 1) ? 4 : 0;
|
||||||
|
if (waste > size * size - 4 * g_ttmn)
|
||||||
|
{
|
||||||
|
ft_board_remove(board, '*');
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ft_board_remove(board, '*');
|
||||||
|
return (ft_solver(board, amap, lttmn, space));
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "fillit.h"
|
#include "fillit.h"
|
||||||
|
|
||||||
t_list *ft_empty_here(char **board, t_list **amap, int size, int i)
|
t_list *ft_empty_here(char **board, int size, int i)
|
||||||
{
|
{
|
||||||
t_list *blob;
|
t_list *blob;
|
||||||
|
|
||||||
|
|
@ -8,12 +8,8 @@ t_list *ft_empty_here(char **board, t_list **amap, int size, int i)
|
||||||
if (board[i / size][i % size] == '.')
|
if (board[i / size][i % size] == '.')
|
||||||
{
|
{
|
||||||
board[i / size][i % size] = '*';
|
board[i / size][i % size] = '*';
|
||||||
/* ft_lst_print(*amap, &ft_putnbr); */
|
blob = ft_empty_around(board, size, i);
|
||||||
/* printf("removing %i from map\n", i); */
|
ft_lstadd(&blob, ft_lstnew(&i, sizeof(int)));
|
||||||
/* ft_lst_print(*amap, &ft_putnbr); */
|
|
||||||
ft_lst_delif(amap, &i, &ft_diff, &ft_lst_cfree);
|
|
||||||
blob = ft_empty_around(board, amap, size, i);
|
|
||||||
ft_lst_sorted_insert(&blob, ft_lstnew(&i, sizeof(int)), &ft_diff);
|
|
||||||
}
|
}
|
||||||
/* printf("list at %i: ", i); */
|
/* printf("list at %i: ", i); */
|
||||||
/* fflush(stdout); */
|
/* fflush(stdout); */
|
||||||
|
|
@ -21,15 +17,45 @@ t_list *ft_empty_here(char **board, t_list **amap, int size, int i)
|
||||||
return (blob);
|
return (blob);
|
||||||
}
|
}
|
||||||
|
|
||||||
t_list *ft_empty_around(char **board, t_list **amap, int size, int i)
|
t_list *ft_empty_around(char **board, int size, int i)
|
||||||
{
|
{
|
||||||
t_list *add;
|
t_list *add;
|
||||||
|
|
||||||
add = NULL;
|
add = NULL;
|
||||||
i % size < size - 1 ? ft_lst_sorted_merge(&add, ft_empty_here(board, amap, size, i + 1), &ft_diff) : 0;
|
i % size < size - 1 ? ft_lsteadd(&add, ft_empty_here(board, size, i + 1)) : 0;
|
||||||
i / size > 0 ? ft_lst_sorted_merge(&add, ft_empty_here(board, amap, size, i - size), &ft_diff) : 0;
|
i / size > 0 ? ft_lsteadd(&add, ft_empty_here(board, size, i - size)) : 0;
|
||||||
i % size > 0 ? ft_lst_sorted_merge(&add, ft_empty_here(board, amap, size, i - 1), &ft_diff) : 0;
|
i % size > 0 ? ft_lsteadd(&add, ft_empty_here(board, size, i - 1)) : 0;
|
||||||
i / size < size - 1 ? ft_lst_sorted_merge(&add, ft_empty_here(board, amap, size, i + size), &ft_diff) : 0;
|
i / size < size - 1 ? ft_lsteadd(&add, ft_empty_here(board, size, i + size)) : 0;
|
||||||
/* ft_lst_print(add, &ft_putnbr); */
|
/* ft_lst_print(add, &ft_putnbr); */
|
||||||
return (add);
|
return (add);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ft_empty_here2(char **board, int size, int i)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
if (board[i / size][i % size] == '.')
|
||||||
|
{
|
||||||
|
board[i / size][i % size] = '*';
|
||||||
|
n++;
|
||||||
|
n += ft_empty_around2(board, size, i);
|
||||||
|
}
|
||||||
|
/* printf("list at %i: ", i); */
|
||||||
|
/* fflush(stdout); */
|
||||||
|
/* ft_lst_print(blob, &ft_putnbr); */
|
||||||
|
return (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ft_empty_around2(char **board, int size, int i)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
n += i % size < size - 1 ? ft_empty_here2(board, size, i + 1) : 0;
|
||||||
|
n += i / size > 0 ? ft_empty_here2(board, size, i - size) : 0;
|
||||||
|
n += i % size > 0 ? ft_empty_here2(board, size, i - 1) : 0;
|
||||||
|
n += i / size < size - 1 ? ft_empty_here2(board, size, i + size) : 0;
|
||||||
|
/* ft_lst_print(add, &ft_putnbr); */
|
||||||
|
return (n);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue