177 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* ************************************************************************** */
 | 
						|
/*                                                                            */
 | 
						|
/*                                                        :::      ::::::::   */
 | 
						|
/*   fillit.h                                           :+:      :+:    :+:   */
 | 
						|
/*                                                    +:+ +:+         +:+     */
 | 
						|
/*   By: gtertysh <marvin@42.fr>                    +#+  +:+       +#+        */
 | 
						|
/*                                                +#+#+#+#+#+   +#+           */
 | 
						|
/*   Created: 2016/12/14 16:42:06 by gtertysh          #+#    #+#             */
 | 
						|
/*   Updated: 2016/12/26 17:46:30 by gtertysh         ###   ########.fr       */
 | 
						|
/*                                                                            */
 | 
						|
/* ************************************************************************** */
 | 
						|
 | 
						|
#ifndef FILLIT_H
 | 
						|
# define FILLIT_H
 | 
						|
 | 
						|
# include "libft.h"
 | 
						|
# include <unistd.h>
 | 
						|
# include <stdlib.h>
 | 
						|
# include <fcntl.h>
 | 
						|
 | 
						|
# define BUF_S 8192
 | 
						|
 | 
						|
/*
 | 
						|
** s_coord contain
 | 
						|
** coordinates of all #
 | 
						|
** within tetromino
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct		s_coord
 | 
						|
{
 | 
						|
	int				y;
 | 
						|
	int				x;
 | 
						|
}					t_coord;
 | 
						|
 | 
						|
/*
 | 
						|
** s_ttrmn contain:
 | 
						|
** 	- t[17] represent tample
 | 
						|
**	  tetromino in 4x4 square
 | 
						|
**	  as string
 | 
						|
** 	- actual width and height
 | 
						|
** 	  of tetromino
 | 
						|
** 	- array of coordinates
 | 
						|
** 	  of each #
 | 
						|
*/
 | 
						|
 | 
						|
typedef	struct		s_ttrmn
 | 
						|
{
 | 
						|
	char			t[17];
 | 
						|
	int				width;
 | 
						|
	int				height;
 | 
						|
	t_coord			c[4];
 | 
						|
}					t_ttrmn;
 | 
						|
 | 
						|
/*
 | 
						|
** s_node - node of double-linked list
 | 
						|
** for Knuth's "dancing links".
 | 
						|
** For more detail see:
 | 
						|
** https://arxiv.org/pdf/cs/0011047v1.pdf
 | 
						|
*/
 | 
						|
 | 
						|
typedef struct		s_node
 | 
						|
{
 | 
						|
	struct s_node	*left;
 | 
						|
	struct s_node	*right;
 | 
						|
	struct s_node	*up;
 | 
						|
	struct s_node	*down;
 | 
						|
	struct s_node	*column;
 | 
						|
	t_coord			coord;
 | 
						|
	int				type;
 | 
						|
	int				size;
 | 
						|
}					t_node;
 | 
						|
 | 
						|
/*
 | 
						|
** declaration of global variable
 | 
						|
** with all possible (19)
 | 
						|
** tetrominoes where each one
 | 
						|
** sits in upper-left corner
 | 
						|
*/
 | 
						|
 | 
						|
extern	t_ttrmn		g_templates[19];
 | 
						|
 | 
						|
/*
 | 
						|
** reads data from file to one string.
 | 
						|
*/
 | 
						|
 | 
						|
char				*read_file(char *path);
 | 
						|
 | 
						|
/*
 | 
						|
** check right amount of '\n', their position
 | 
						|
** and allowed chars
 | 
						|
*/
 | 
						|
 | 
						|
void				check_string(char *string);
 | 
						|
 | 
						|
/*
 | 
						|
** split string to table by '\n'
 | 
						|
*/
 | 
						|
 | 
						|
char				**to_table(char **string);
 | 
						|
 | 
						|
/*
 | 
						|
** creates new table where each string represent whole figrure.
 | 
						|
** "Glues" each set of four strings into one
 | 
						|
*/
 | 
						|
 | 
						|
char				**glue_figure(char **table);
 | 
						|
 | 
						|
/*
 | 
						|
** move tetromino in upper-left corner
 | 
						|
*/
 | 
						|
 | 
						|
void				move_up_left(char **table);
 | 
						|
 | 
						|
/*
 | 
						|
** creates first node of double-chained list
 | 
						|
** (in future "torus")
 | 
						|
*/
 | 
						|
 | 
						|
t_node				*init_root(int size);
 | 
						|
 | 
						|
/*
 | 
						|
** links new node to the left of the root
 | 
						|
*/
 | 
						|
 | 
						|
t_node				*add_column(t_node *root);
 | 
						|
 | 
						|
/*
 | 
						|
** calls function above to create first size * size + amount
 | 
						|
** nodes, where:
 | 
						|
** 		size - size of square side
 | 
						|
** 		amount - quantity of tetrominoes in file
 | 
						|
*/
 | 
						|
 | 
						|
t_node				**add_cols(t_node *root, int number);
 | 
						|
 | 
						|
/*
 | 
						|
** actually, the same as add_column. But why not to add yet another
 | 
						|
** "useful" function ? :)
 | 
						|
*/
 | 
						|
 | 
						|
t_node				*add_node(t_node *col);
 | 
						|
 | 
						|
/*
 | 
						|
** again, the same as add_node() and add_column(). For clarity :)
 | 
						|
*/
 | 
						|
 | 
						|
t_node				*add_node_with_coord(t_node *col, t_coord row, int type);
 | 
						|
 | 
						|
/*
 | 
						|
** output of the program
 | 
						|
*/
 | 
						|
 | 
						|
void				print_square(t_node **sol, int amount, int size);
 | 
						|
 | 
						|
/*
 | 
						|
** add all possible position variants of a given figures.
 | 
						|
*/
 | 
						|
 | 
						|
void				add_rows(int *types, int amount, int size,
 | 
						|
								t_node **cols_arr);
 | 
						|
void				link_row(int *col_nums, t_node **cols_arr);
 | 
						|
void				add_row(int *col_numbers, t_node **cols_arr,
 | 
						|
								t_coord coord, int type);
 | 
						|
void				search(t_node *root, t_node **solution, int k, int amount);
 | 
						|
int					cover(t_node *to_cover);
 | 
						|
int					uncover(t_node *to_uncover);
 | 
						|
int					*get_types(char **ttr);
 | 
						|
int					get_amount(char **ttr);
 | 
						|
int					ft_sqrt_ceil(int num);
 | 
						|
void				fill_map(char *map, int size, t_node *ttr, int letter);
 | 
						|
void				init(char *path);
 | 
						|
void				error(void);
 | 
						|
void				check_ch(char ch);
 | 
						|
void				check_table(char **ttr);
 | 
						|
void				algorithm(int *types, int amount);
 | 
						|
 | 
						|
#endif
 |