From bc678f6a359e7a8a13449a535c0fe94d6becf9e9 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 4 Sep 2016 02:02:11 +0200 Subject: [PATCH] new element : t_list *map that keeps track of board avdancement, also blob is now a map of the actual blob, not just the size --- fillit/src/fillit_solver.c | 15 +++++----- fillit/src/fillit_waste.c | 57 +++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/fillit/src/fillit_solver.c b/fillit/src/fillit_solver.c index b9f7a222..689ef2c9 100644 --- a/fillit/src/fillit_solver.c +++ b/fillit/src/fillit_solver.c @@ -9,9 +9,8 @@ int ft_solved(char **board) return (1); } -int ft_solver(char **board, t_ttmn *ttmn) +int ft_solver(char **board, t_list *map, t_ttmn *ttmn) { - int i; int j; int size; @@ -21,15 +20,17 @@ int ft_solver(char **board, t_ttmn *ttmn) return (ft_solved(board)); /* ft_show_board(board); */ size = ft_strlen(*board); - i = -1; - while (++i < size * size) + while (map) { /* ft_show_board(board); */ - if (ft_board_add(board, *ttmn, i)) + if (ft_board_add(board, *ttmn, map->content)) continue ; - if (ft_validate_waste(board, ttmn + 1)) + ft_map_remove(map, i, *ttmn); + if (ft_validate_waste(board, map, ttmn + 1)) return (1); - ft_board_remove(board, ttmn->id); + ft_map_add(map, i, *ttmn); + ft_board_remove_ttmn(&map, ttmn->id); + map = map->next; } return (0); } diff --git a/fillit/src/fillit_waste.c b/fillit/src/fillit_waste.c index 3cd003d0..d3e72273 100644 --- a/fillit/src/fillit_waste.c +++ b/fillit/src/fillit_waste.c @@ -80,48 +80,49 @@ int ft_fit_any(char **board, t_ttmn *ttmn, int i, int blob) return (0); } -int ft_validate_waste(char **board, t_ttmn *ttmn) +int ft_validate_waste(char **board, t_list *map, t_ttmn *ttmn) { - int waste; - int y; - int blob; - int size; + t_list *blob; + int waste; + int size; if (ttmn->id == '0') return (ft_solver(board, ttmn + 1)); if (!ttmn->id) return (ft_solved(board)); + blob = NULL; waste = 0; size = ft_strlen(*board); - y = -1; /* ft_show_board(board); */ - while (++y < size * size) + while (map) { - if (board[y / size][y % size] != '.') + ft_board_remove(board, '*'); + if (board[map->content / size][map->content % size] != '.') + { + map = map->next; continue ; - ft_board_replace(board, '*', '^'); - blob = ft_waste_here(board, size, y); - /* printf("found blob=%i at %i\n", blob, y); */ - /* fflush(stdout); */ - /* ft_show_board(board); */ - waste += blob % 4; - if (waste > size * size - 4 * g_ttmn) - { - ft_board_remove(board, '*'); - ft_board_remove(board, '^'); - return (0); } - if (blob / 4 == 1 && ft_fit_any(board, ttmn, y, blob)) - return (1); - waste += (blob / 4 == 1) ? 4 : 0; + ft_lstadd(&blob, ft_waste_here(board, size, map->content)); + waste += ft_lstsize(blob) % 4;; + ft_map_remove_blob(&map, blob); if (waste > size * size - 4 * g_ttmn) - { - ft_board_remove(board, '*'); - ft_board_remove(board, '^'); return (0); - } + map = map->next; + } + while (blob) + { + if (ft_lstsize(blob->content) / 4 == 1) + { + if (ft_fit_any(board, blob->content, ttmn, y, blob)) + return (1); + else + { + waste += (ft_lstsize(blob->content) / 4 == 1) ? 4 : 0; + if (waste > size * size - 4 * g_ttmn) + return (0); + } + } + blob = blob->next; } - ft_board_remove(board, '*'); - ft_board_remove(board, '^'); return (ft_solver(board, ttmn)); }