This commit is contained in:
Jack Halford 2016-09-01 17:41:47 +02:00
parent 359b453734
commit 59da8c471f
6 changed files with 114 additions and 117 deletions

View file

@ -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

View file

@ -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);

View file

@ -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); */
/* } */

View file

@ -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++;

View file

@ -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);

View file

@ -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 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 max_waste;
int waste; int waste;
int i; int i;
int j; int j;
int blob; int blob;
size_t size; 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);
} }