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 FILLIT_H
|
||||||
# define BUF_SIZE 32
|
# define BUF_SIZE 32
|
||||||
|
|
||||||
typedef struct s_tetrim
|
extern size_t g_size;
|
||||||
|
|
||||||
|
typedef struct s_ttmn
|
||||||
{
|
{
|
||||||
char id;
|
char id;
|
||||||
int pos[3][2];
|
int pos[4][2];
|
||||||
int placed;
|
} t_ttmn;
|
||||||
} t_tetrim;
|
|
||||||
|
t_ttmn *ft_get_ttmn(char *filename);
|
||||||
|
void ft_show_ttmn(t_ttmn ttmn);
|
||||||
|
void ft_show_board(char **board);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,104 +1,140 @@
|
||||||
#include "fillit.h"
|
#include "fillit.h"
|
||||||
|
|
||||||
|
size_t g_size = 20;
|
||||||
|
|
||||||
void ft_usage(void)
|
void ft_usage(void)
|
||||||
{
|
{
|
||||||
ft_putendl("error");
|
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;
|
size_t size;
|
||||||
char buf[BUF_SIZE + 1];
|
size_t k;
|
||||||
int ret;
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
int k;
|
|
||||||
int l;
|
|
||||||
int ref[2];
|
|
||||||
char letter = 'A';
|
|
||||||
t_tetrim *tetrims;
|
|
||||||
|
|
||||||
tetrims = (t_tetrim *)ft_memalloc(sizeof(t_tetrim) * 27);
|
size = 0;
|
||||||
fd = open(filename, O_RDONLY);
|
if (board)
|
||||||
if (fd == -1)
|
size = ft_strlen(*board);
|
||||||
return (0);
|
|
||||||
k = -1;
|
k = -1;
|
||||||
j = 0;
|
while (++k < 3)
|
||||||
l = 0;
|
|
||||||
while ((ret = read(fd, buf, BUF_SIZE)))
|
|
||||||
{
|
{
|
||||||
buf[ret] = '\0';
|
if (i + block.pos[k][0] >= size || j + block.pos[k][1] >= size)
|
||||||
i = 0;
|
continue ;
|
||||||
while (buf[i])
|
if (board[i + block.pos[k][0]][j + block.pos[k][1]] != '.')
|
||||||
{
|
|
||||||
/* printf("%i, %i, %i: '%c'\n", i, j, k, buf[i]); */
|
|
||||||
if (buf[i] == '.')
|
|
||||||
;
|
|
||||||
else if (buf[i] == '#')
|
|
||||||
{
|
|
||||||
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);
|
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)
|
||||||
|
{
|
||||||
|
ft_grow_board(&new_board);
|
||||||
|
size++;
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
new_board[i + block.pos[k][0]][j + block.pos[k][1]] = block.id;
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
else if (buf[i] == '\n')
|
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)
|
||||||
{
|
{
|
||||||
if (i > 0 && buf[i - 1] == '\n')
|
g_size = ft_strlen(*board);
|
||||||
|
printf("new solution : size = %zu\n", g_size);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while (i < g_size)
|
||||||
{
|
{
|
||||||
if (k != 3 || j != 20)
|
j = 0;
|
||||||
return (0);
|
while (j <= i)
|
||||||
l++;
|
|
||||||
j = -1;
|
|
||||||
k = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if ((j + 1) % 5 != 0)
|
printf("trying: %zu,%zu\n", i, j);
|
||||||
return (0);
|
if (ft_check_pos(board, *ttmn, i, j))
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
return (0);
|
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);
|
||||||
|
}
|
||||||
|
if (j != i && ft_check_pos(board, *ttmn, j, i))
|
||||||
|
{
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
i++;
|
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
if (k != 3 || j != 20)
|
|
||||||
return (0);
|
return (0);
|
||||||
tetrims[l + 1].id = '\0';
|
|
||||||
return (tetrims);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
t_tetrim *tetrims;
|
t_ttmn *ttmn;
|
||||||
int i;
|
|
||||||
int l;
|
|
||||||
|
|
||||||
if (ac != 2 || !(tetrims = ft_get_tetrims(av[1])))
|
if (ac != 2 || !(ttmn = ft_get_ttmn(av[1])))
|
||||||
{
|
{
|
||||||
ft_usage();
|
ft_usage();
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
l = -1;
|
/* int l = -1; */
|
||||||
while (tetrims[++l].id)
|
/* while (ttmn[++l].id) */
|
||||||
{
|
/* ft_show_ttmn(ttmn[l]); */
|
||||||
printf("%c\n",tetrims[l].id);
|
ft_solver(NULL, ttmn);
|
||||||
for (i=0; i < 3; i++)
|
|
||||||
printf("%i,%i\n", tetrims[l].pos[i][0], tetrims[l].pos[i][1]);
|
|
||||||
ft_putendl("");
|
|
||||||
}
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue