diff --git a/fillit/Makefile b/fillit/Makefile index 239e56af..1953f9ca 100644 --- a/fillit/Makefile +++ b/fillit/Makefile @@ -18,7 +18,7 @@ F_LIB = ft F_LIB := $(addprefix -l, $(F_LIB)) W_FLAGS = -Wall -Wextra -Werror -DEBUG = +DEBUG = -w MKDIR = mkdir -p RM = /bin/rm -rf diff --git a/fillit/includes/fillit.h b/fillit/includes/fillit.h index a9b34089..65df691c 100644 --- a/fillit/includes/fillit.h +++ b/fillit/includes/fillit.h @@ -17,23 +17,20 @@ typedef struct s_ttmn t_ttmn *ft_get_ttmn(char *filename); -void ft_free_board(char ***board); char **ft_empty_board(size_t size); -void ft_fill_board(char **dst, char **src); 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_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); 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_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_here(char ***board_ptr, int i, int j); diff --git a/fillit/src/fillit_legacy.c b/fillit/src/fillit_legacy.c index 9cd7b7e5..8508d2be 100644 --- a/fillit/src/fillit_legacy.c +++ b/fillit/src/fillit_legacy.c @@ -1,29 +1,55 @@ -/* -void ft_grow_board(char **board) -{ - int i; - int size; +/* void ft_grow_board(char **board) */ +/* { */ +/* int i; */ +/* int size; */ - size = ft_strlen(*board); - i = 0; - while (++i <= size) - { - board[i][size] = '.'; - board[size][i] = '.'; - } -} +/* size = ft_strlen(*board); */ +/* i = 0; */ +/* while (++i <= size) */ +/* { */ +/* board[i][size] = '.'; */ +/* board[size][i] = '.'; */ +/* } */ +/* } */ -void ft_shrink_board(char **board) -{ - int i; - int size; +/* void ft_shrink_board(char **board) */ +/* { */ +/* int i; */ +/* int size; */ - size = ft_strlen(*board); - i = -1; - while (++i < size) - { - board[i][size - 1] = '\0'; - board[size - 1][i] = '\0'; - } -} -*/ +/* size = ft_strlen(*board); */ +/* i = -1; */ +/* while (++i < size) */ +/* { */ +/* board[i][size - 1] = '\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); */ +/* } */ diff --git a/fillit/src/fillit_lib.c b/fillit/src/fillit_lib.c index 07c0fb25..8b5602e0 100644 --- a/fillit/src/fillit_lib.c +++ b/fillit/src/fillit_lib.c @@ -1,5 +1,24 @@ #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) { 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) { int i; @@ -97,7 +97,7 @@ int ft_board_add(char **board, t_ttmn block, size_t i, size_t j) /* fflush(stdout); */ if (x > size - 1 || y > size - 1 || x < 0 || y < 0) return (1); - if (board[y][x] != '.') + if (board[y][x] != '.' && board[y][x] != '*') return (1); /* ft_show_board(board); */ k++; diff --git a/fillit/src/fillit_solver.c b/fillit/src/fillit_solver.c index ff928f1e..c5d87179 100644 --- a/fillit/src/fillit_solver.c +++ b/fillit/src/fillit_solver.c @@ -1,43 +1,15 @@ #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 i; int j; int size; + int max_waste; /* ft_show_board(board); */ size = ft_strlen(*board); + max_waste = size * size - 4 * g_ttmn; if (!(*ttmn).id) { 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)) 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)) return (1); diff --git a/fillit/src/fillit_waste.c b/fillit/src/fillit_waste.c index e7f22442..3c40baed 100644 --- a/fillit/src/fillit_waste.c +++ b/fillit/src/fillit_waste.c @@ -28,56 +28,58 @@ int ft_waste_around(char ***board_ptr, int i, int j) 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 waste; - int i; - int j; - int blob; - size_t size; + int y; + int x; + int l; + int 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); - max_waste = g_target * g_target - g_ttmn * 4; waste = 0; size = ft_strlen(*board); i = -1; /* ft_show_board(board); */ - while (++i < (int)size) + while (++i < size) { j = -1; - while (++j < (int)size) + while (++j < size) { blob = ft_waste_here(&board, i, j); - if (blob == 4) - { - 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 ; - } - } - } + /* if (blob / 4 == 1) */ + /* waste += ft_additional_waste(board, ttmn, i, j); */ waste += blob % 4; if (waste > max_waste) { - /* printf("waste = %i (failed: max = %i)\n", waste, max_waste); */ - /* fflush(stdout); */ - /* ft_free_board(&board); */ return (0); } } } - /* printf("waste = %i (passed: max = %i)\n", waste, max_waste); */ - /* fflush(stdout); */ - /* ft_free_board(&board); */ return(1); }