diff --git a/fillit/includes/fillit.h b/fillit/includes/fillit.h index d19c37be..0ce797f3 100644 --- a/fillit/includes/fillit.h +++ b/fillit/includes/fillit.h @@ -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 diff --git a/fillit/src/main.c b/fillit/src/main.c index b194fd1a..5fc4c8ed 100644 --- a/fillit/src/main.c +++ b/fillit/src/main.c @@ -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); }