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

View file

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