solver almost done

This commit is contained in:
Jack Halford 2016-08-29 16:53:05 +02:00
parent b9edcec9b9
commit c72b51aeea
2 changed files with 119 additions and 78 deletions

View file

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

View file

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