solver almost done
This commit is contained in:
parent
b9edcec9b9
commit
c72b51aeea
2 changed files with 119 additions and 78 deletions
|
|
@ -5,11 +5,16 @@
|
|||
# define FILLIT_H
|
||||
# define BUF_SIZE 32
|
||||
|
||||
typedef struct s_tetrim
|
||||
extern size_t g_size;
|
||||
|
||||
typedef struct s_ttmn
|
||||
{
|
||||
char id;
|
||||
int pos[3][2];
|
||||
int placed;
|
||||
} t_tetrim;
|
||||
int pos[4][2];
|
||||
} t_ttmn;
|
||||
|
||||
t_ttmn *ft_get_ttmn(char *filename);
|
||||
void ft_show_ttmn(t_ttmn ttmn);
|
||||
void ft_show_board(char **board);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,104 +1,140 @@
|
|||
#include "fillit.h"
|
||||
|
||||
size_t g_size = 20;
|
||||
|
||||
void ft_usage(void)
|
||||
{
|
||||
ft_putendl("error");
|
||||
}
|
||||
|
||||
t_tetrim *ft_get_tetrims(char *filename)
|
||||
int ft_check_pos(char **board, t_ttmn block, size_t i, size_t j)
|
||||
{
|
||||
int fd;
|
||||
char buf[BUF_SIZE + 1];
|
||||
int ret;
|
||||
int i;
|
||||
int j;
|
||||
int k;
|
||||
int l;
|
||||
int ref[2];
|
||||
char letter = 'A';
|
||||
t_tetrim *tetrims;
|
||||
size_t size;
|
||||
size_t k;
|
||||
|
||||
tetrims = (t_tetrim *)ft_memalloc(sizeof(t_tetrim) * 27);
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd == -1)
|
||||
return (0);
|
||||
size = 0;
|
||||
if (board)
|
||||
size = ft_strlen(*board);
|
||||
k = -1;
|
||||
j = 0;
|
||||
l = 0;
|
||||
while ((ret = read(fd, buf, BUF_SIZE)))
|
||||
while (++k < 3)
|
||||
{
|
||||
buf[ret] = '\0';
|
||||
i = 0;
|
||||
while (buf[i])
|
||||
if (i + block.pos[k][0] >= size || j + block.pos[k][1] >= size)
|
||||
continue ;
|
||||
if (board[i + block.pos[k][0]][j + block.pos[k][1]] != '.')
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
void ft_grow_board(char ***board_ptr)
|
||||
{
|
||||
size_t size;
|
||||
size_t i;
|
||||
size_t j;
|
||||
char **new_board;
|
||||
char **board;
|
||||
|
||||
board = *board_ptr;
|
||||
size = board ? ft_strlen(*board) : 0;
|
||||
new_board = (char **)malloc(sizeof(char *) * (size + 1));
|
||||
i = -1;
|
||||
while (++i < size)
|
||||
{
|
||||
new_board[i] = ft_strjoin(board[i], ".");
|
||||
free(board[i]);
|
||||
}
|
||||
j = -1;
|
||||
new_board[i] = (char *)malloc(sizeof(char) * (size + 1));
|
||||
while (++j < size + 1)
|
||||
{
|
||||
new_board[i][j] = '.';
|
||||
}
|
||||
free(*board_ptr);
|
||||
*board_ptr = new_board;
|
||||
}
|
||||
|
||||
char **ft_next_board(char **board, t_ttmn block, size_t i, size_t j)
|
||||
{
|
||||
size_t size;
|
||||
size_t k;
|
||||
char **new_board;
|
||||
|
||||
size = board ? ft_strlen(*board) : 0;
|
||||
new_board = size ? (char **)malloc(sizeof(char *) * size) : NULL;
|
||||
k = -1;
|
||||
while (++k < size)
|
||||
new_board[k] = ft_strdup(board[k]);
|
||||
k = 0;
|
||||
while (k < 4)
|
||||
{
|
||||
if (i + block.pos[k][0] >= size || j + block.pos[k][1] >= size)
|
||||
{
|
||||
/* printf("%i, %i, %i: '%c'\n", i, j, k, buf[i]); */
|
||||
if (buf[i] == '.')
|
||||
;
|
||||
else if (buf[i] == '#')
|
||||
ft_grow_board(&new_board);
|
||||
size++;
|
||||
continue ;
|
||||
}
|
||||
new_board[i + block.pos[k][0]][j + block.pos[k][1]] = block.id;
|
||||
k++;
|
||||
}
|
||||
return (new_board);
|
||||
}
|
||||
|
||||
int ft_solver(char **board, t_ttmn *ttmn)
|
||||
{
|
||||
size_t i;
|
||||
size_t j;
|
||||
char **new_board;
|
||||
|
||||
ft_show_ttmn(*ttmn);
|
||||
ft_show_board(board);
|
||||
if (!(*ttmn).id)
|
||||
{
|
||||
g_size = ft_strlen(*board);
|
||||
printf("new solution : size = %zu\n", g_size);
|
||||
return(0);
|
||||
}
|
||||
i = 0;
|
||||
while (i < g_size)
|
||||
{
|
||||
j = 0;
|
||||
while (j <= i)
|
||||
{
|
||||
printf("trying: %zu,%zu\n", i, j);
|
||||
if (ft_check_pos(board, *ttmn, i, j))
|
||||
{
|
||||
if (k == -1)
|
||||
{
|
||||
tetrims[l].id = letter++;
|
||||
ref[0] = j / 5;
|
||||
ref[1] = j % 5;
|
||||
}
|
||||
else if (k >= 0 && k <= 2)
|
||||
{
|
||||
tetrims[l].pos[k][0] = j / 5 - ref[0];
|
||||
tetrims[l].pos[k][1] = j % 5 - ref[1];
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
k++;
|
||||
printf("pos ok : %zu,%zu\n", i, j);
|
||||
new_board = ft_next_board(board, *ttmn, i, j);
|
||||
if (ft_solver(new_board, ttmn + 1))
|
||||
return (1);
|
||||
free(new_board);
|
||||
}
|
||||
else if (buf[i] == '\n')
|
||||
if (j != i && ft_check_pos(board, *ttmn, j, i))
|
||||
{
|
||||
if (i > 0 && buf[i - 1] == '\n')
|
||||
{
|
||||
if (k != 3 || j != 20)
|
||||
return (0);
|
||||
l++;
|
||||
j = -1;
|
||||
k = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((j + 1) % 5 != 0)
|
||||
return (0);
|
||||
}
|
||||
printf("pos ok : %zu,%zu\n", j, i);
|
||||
new_board = ft_next_board(board, *ttmn, j, i);
|
||||
if (ft_solver(new_board, ttmn + 1))
|
||||
return (1);
|
||||
free(new_board);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (k != 3 || j != 20)
|
||||
return (0);
|
||||
tetrims[l + 1].id = '\0';
|
||||
return (tetrims);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
t_tetrim *tetrims;
|
||||
int i;
|
||||
int l;
|
||||
t_ttmn *ttmn;
|
||||
|
||||
if (ac != 2 || !(tetrims = ft_get_tetrims(av[1])))
|
||||
if (ac != 2 || !(ttmn = ft_get_ttmn(av[1])))
|
||||
{
|
||||
ft_usage();
|
||||
return (1);
|
||||
}
|
||||
l = -1;
|
||||
while (tetrims[++l].id)
|
||||
{
|
||||
printf("%c\n",tetrims[l].id);
|
||||
for (i=0; i < 3; i++)
|
||||
printf("%i,%i\n", tetrims[l].pos[i][0], tetrims[l].pos[i][1]);
|
||||
ft_putendl("");
|
||||
}
|
||||
/* int l = -1; */
|
||||
/* while (ttmn[++l].id) */
|
||||
/* ft_show_ttmn(ttmn[l]); */
|
||||
ft_solver(NULL, ttmn);
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue