commit
This commit is contained in:
parent
359b453734
commit
59da8c471f
6 changed files with 114 additions and 117 deletions
|
|
@ -18,7 +18,7 @@ F_LIB = ft
|
||||||
F_LIB := $(addprefix -l, $(F_LIB))
|
F_LIB := $(addprefix -l, $(F_LIB))
|
||||||
|
|
||||||
W_FLAGS = -Wall -Wextra -Werror
|
W_FLAGS = -Wall -Wextra -Werror
|
||||||
DEBUG =
|
DEBUG = -w
|
||||||
MKDIR = mkdir -p
|
MKDIR = mkdir -p
|
||||||
RM = /bin/rm -rf
|
RM = /bin/rm -rf
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,23 +17,20 @@ typedef struct s_ttmn
|
||||||
|
|
||||||
t_ttmn *ft_get_ttmn(char *filename);
|
t_ttmn *ft_get_ttmn(char *filename);
|
||||||
|
|
||||||
void ft_free_board(char ***board);
|
|
||||||
char **ft_empty_board(size_t size);
|
char **ft_empty_board(size_t size);
|
||||||
void ft_fill_board(char **dst, char **src);
|
|
||||||
char **ft_copy_board(char **board);
|
char **ft_copy_board(char **board);
|
||||||
|
void ft_free_board(char ***board);
|
||||||
|
void ft_fill_board(char **dst, char **src);
|
||||||
|
|
||||||
void ft_show_ttmn(t_ttmn ttmn);
|
void ft_show_ttmn(t_ttmn ttmn);
|
||||||
void ft_show_board(char **board);
|
void ft_show_board(char **board);
|
||||||
|
|
||||||
void ft_grow_board(char **board);
|
|
||||||
void ft_shrink_board(char **board);
|
|
||||||
int ft_board_add(char **board, t_ttmn block, size_t i, size_t j);
|
int ft_board_add(char **board, t_ttmn block, size_t i, size_t j);
|
||||||
void ft_board_remove(char **board, char c);
|
void ft_board_remove(char **board, char c);
|
||||||
|
|
||||||
int ft_check_pos(char **board, t_ttmn block, int i, int j);
|
|
||||||
int ft_solver(char **board, t_ttmn *ttmn);
|
int ft_solver(char **board, t_ttmn *ttmn);
|
||||||
|
|
||||||
int ft_validate_waste(char **board, t_ttmn *blocks);
|
int ft_validate_waste(char **board, t_ttmn *blocks, int max_waste);
|
||||||
int ft_waste_around(char ***board_ptr, int i, int j);
|
int ft_waste_around(char ***board_ptr, int i, int j);
|
||||||
int ft_waste_here(char ***board_ptr, int i, int j);
|
int ft_waste_here(char ***board_ptr, int i, int j);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,55 @@
|
||||||
/*
|
/* void ft_grow_board(char **board) */
|
||||||
void ft_grow_board(char **board)
|
/* { */
|
||||||
{
|
/* int i; */
|
||||||
int i;
|
/* int size; */
|
||||||
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) */
|
||||||
|
/* { */
|
||||||
|
/* size_t k; */
|
||||||
|
/* int new_size; */
|
||||||
|
/* int size; */
|
||||||
|
/* int x; */
|
||||||
|
/* int y; */
|
||||||
|
|
||||||
|
/* size = ft_strlen(*board); */
|
||||||
|
/* new_size = size; */
|
||||||
|
/* k = -1; */
|
||||||
|
/* while (++k < 4) */
|
||||||
|
/* { */
|
||||||
|
/* x = (int)j + block.pos[k][1]; */
|
||||||
|
/* y = (int)i + block.pos[k][0]; */
|
||||||
|
/* if (x < 0 || x < 0) */
|
||||||
|
/* return (0); */
|
||||||
|
/* if (x > size - 1 || y > size - 1) */
|
||||||
|
/* { */
|
||||||
|
/* new_size = MAX(new_size, MAX(x + 1, y + 1)); */
|
||||||
|
/* continue ; */
|
||||||
|
/* } */
|
||||||
|
/* if (board[y][x] != '.' && board[y][x] != '*') */
|
||||||
|
/* return (0); */
|
||||||
|
/* } */
|
||||||
|
/* return (0); */
|
||||||
|
/* } */
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,24 @@
|
||||||
#include "fillit.h"
|
#include "fillit.h"
|
||||||
|
|
||||||
|
char **ft_empty_board(size_t size)
|
||||||
|
{
|
||||||
|
char **board;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
board = (char **)malloc(sizeof(char *) * (size + 1));
|
||||||
|
i = -1;
|
||||||
|
while (++i < (int)size)
|
||||||
|
{
|
||||||
|
board[i] = ft_strnew(size);
|
||||||
|
j = -1;
|
||||||
|
while (++j < (int)size)
|
||||||
|
board[i][j] = '.';
|
||||||
|
}
|
||||||
|
board[i] = NULL;
|
||||||
|
return (board);
|
||||||
|
}
|
||||||
|
|
||||||
char **ft_copy_board(char **board)
|
char **ft_copy_board(char **board)
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
@ -29,25 +48,6 @@ void ft_fill_board(char **dst, char **src)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char **ft_empty_board(size_t size)
|
|
||||||
{
|
|
||||||
char **board;
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
board = (char **)malloc(sizeof(char *) * (size + 1));
|
|
||||||
i = -1;
|
|
||||||
while (++i < (int)size)
|
|
||||||
{
|
|
||||||
board[i] = ft_strnew(size);
|
|
||||||
j = -1;
|
|
||||||
while (++j < (int)size)
|
|
||||||
board[i][j] = '.';
|
|
||||||
}
|
|
||||||
board[i] = NULL;
|
|
||||||
return (board);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ft_free_board(char ***board)
|
void ft_free_board(char ***board)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -97,7 +97,7 @@ int ft_board_add(char **board, t_ttmn block, size_t i, size_t j)
|
||||||
/* fflush(stdout); */
|
/* fflush(stdout); */
|
||||||
if (x > size - 1 || y > size - 1 || x < 0 || y < 0)
|
if (x > size - 1 || y > size - 1 || x < 0 || y < 0)
|
||||||
return (1);
|
return (1);
|
||||||
if (board[y][x] != '.')
|
if (board[y][x] != '.' && board[y][x] != '*')
|
||||||
return (1);
|
return (1);
|
||||||
/* ft_show_board(board); */
|
/* ft_show_board(board); */
|
||||||
k++;
|
k++;
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,15 @@
|
||||||
#include "fillit.h"
|
#include "fillit.h"
|
||||||
|
|
||||||
int ft_check_pos(char **board, t_ttmn block, int i, int j)
|
|
||||||
{
|
|
||||||
size_t k;
|
|
||||||
int new_size;
|
|
||||||
int size;
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
size = ft_strlen(*board);
|
|
||||||
new_size = size;
|
|
||||||
k = -1;
|
|
||||||
while (++k < 4)
|
|
||||||
{
|
|
||||||
x = (int)j + block.pos[k][1];
|
|
||||||
y = (int)i + block.pos[k][0];
|
|
||||||
/* if (block.id == 'L') */
|
|
||||||
/* printf("trying %i, %i\n", y, x); */
|
|
||||||
if (x < 0 || x < 0)
|
|
||||||
return (100);
|
|
||||||
if (x > size - 1 || y > size - 1)
|
|
||||||
{
|
|
||||||
new_size = MAX(new_size, MAX(x + 1, y + 1));
|
|
||||||
continue ;
|
|
||||||
}
|
|
||||||
if (board[y][x] != '.' && board[y][x] != '*')
|
|
||||||
return (100);
|
|
||||||
}
|
|
||||||
return (new_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ft_solver(char **board, t_ttmn *ttmn)
|
int ft_solver(char **board, t_ttmn *ttmn)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
int size;
|
int size;
|
||||||
|
int max_waste;
|
||||||
|
|
||||||
/* ft_show_board(board); */
|
/* ft_show_board(board); */
|
||||||
size = ft_strlen(*board);
|
size = ft_strlen(*board);
|
||||||
|
max_waste = size * size - 4 * g_ttmn;
|
||||||
if (!(*ttmn).id)
|
if (!(*ttmn).id)
|
||||||
{
|
{
|
||||||
printf("new solution : size %i\n", size);
|
printf("new solution : size %i\n", size);
|
||||||
|
|
@ -52,7 +24,7 @@ int ft_solver(char **board, t_ttmn *ttmn)
|
||||||
{
|
{
|
||||||
if (ft_board_add(board, *ttmn, i, j))
|
if (ft_board_add(board, *ttmn, i, j))
|
||||||
continue ;
|
continue ;
|
||||||
if (size == (int)g_target && !ft_validate_waste(board, ttmn + 1))
|
if (!ft_validate_waste(board, ttmn + 1, max_waste))
|
||||||
;
|
;
|
||||||
else if (ft_solver(board, ttmn + 1))
|
else if (ft_solver(board, ttmn + 1))
|
||||||
return (1);
|
return (1);
|
||||||
|
|
|
||||||
|
|
@ -28,56 +28,58 @@ int ft_waste_around(char ***board_ptr, int i, int j)
|
||||||
return (n);
|
return (n);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_validate_waste(char **board, t_ttmn *ttmn)
|
int ft_additional_waste(char **board, t_ttmn *ttmn, int i, int j)
|
||||||
{
|
{
|
||||||
int max_waste;
|
int y;
|
||||||
int waste;
|
int x;
|
||||||
int i;
|
int l;
|
||||||
int j;
|
int size;
|
||||||
int blob;
|
|
||||||
size_t size;
|
/* ft_show_board(board); */
|
||||||
|
y = i - 1;
|
||||||
|
x = j - 1;
|
||||||
|
size = ft_strlen(*board);
|
||||||
|
while (++y < size)
|
||||||
|
{
|
||||||
|
x = (x == size ? -1 : x);
|
||||||
|
while (++x < size);
|
||||||
|
{
|
||||||
|
l = -1;
|
||||||
|
while (ttmn[++l].id)
|
||||||
|
if (!ft_board_add(board, ttmn[l], i, j))
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ft_validate_waste(char **board, t_ttmn *ttmn, int max_waste)
|
||||||
|
{
|
||||||
|
int waste;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
int blob;
|
||||||
|
int size;
|
||||||
|
|
||||||
board = ft_copy_board(board);
|
board = ft_copy_board(board);
|
||||||
max_waste = g_target * g_target - g_ttmn * 4;
|
|
||||||
waste = 0;
|
waste = 0;
|
||||||
size = ft_strlen(*board);
|
size = ft_strlen(*board);
|
||||||
i = -1;
|
i = -1;
|
||||||
/* ft_show_board(board); */
|
/* ft_show_board(board); */
|
||||||
while (++i < (int)size)
|
while (++i < size)
|
||||||
{
|
{
|
||||||
j = -1;
|
j = -1;
|
||||||
while (++j < (int)size)
|
while (++j < size)
|
||||||
{
|
{
|
||||||
blob = ft_waste_here(&board, i, j);
|
blob = ft_waste_here(&board, i, j);
|
||||||
if (blob == 4)
|
/* if (blob / 4 == 1) */
|
||||||
{
|
/* waste += ft_additional_waste(board, ttmn, i, j); */
|
||||||
waste += 4;
|
|
||||||
int l = -1;
|
|
||||||
/* ft_show_board(board); */
|
|
||||||
while (ttmn[++l].id)
|
|
||||||
{
|
|
||||||
/* ft_show_ttmn(ttmn[l]); */
|
|
||||||
/* printf("checking at %i,%i = %i vs %i\n", i, j, ft_check_pos(board, ttmn[l], i, j), (int)size); */
|
|
||||||
/* fflush(stdout); */
|
|
||||||
if (ft_check_pos(board, ttmn[l], i, j) == (int)size)
|
|
||||||
{
|
|
||||||
waste -= 4;
|
|
||||||
break ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
waste += blob % 4;
|
waste += blob % 4;
|
||||||
if (waste > max_waste)
|
if (waste > max_waste)
|
||||||
{
|
{
|
||||||
/* printf("waste = %i (failed: max = %i)\n", waste, max_waste); */
|
|
||||||
/* fflush(stdout); */
|
|
||||||
/* ft_free_board(&board); */
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* printf("waste = %i (passed: max = %i)\n", waste, max_waste); */
|
|
||||||
/* fflush(stdout); */
|
|
||||||
/* ft_free_board(&board); */
|
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue