109 lines
2.8 KiB
C
109 lines
2.8 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* bruteforce.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: jmikola <jmikola@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2023/07/22 12:00:11 by psalame #+# #+# */
|
|
/* Updated: 2023/07/23 12:43:04 by psalame ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
int get_area_size(void);
|
|
int ft_test_possibility(int **tab, int i);
|
|
int verif_non_double(int i, int **tab);
|
|
int verif_col_down(int i, int **tab);
|
|
int verif_col_up(int i, int **tab);
|
|
int verif_row_right(int i, int **tab);
|
|
int verif_row_left(int i, int **tab);
|
|
int **get_row(void);
|
|
int **get_col(void);
|
|
|
|
int verif_all_row(int i, int **tab)
|
|
{
|
|
int row_left;
|
|
int row_right;
|
|
int area_size;
|
|
|
|
area_size = get_area_size();
|
|
row_left = verif_row_left(i, tab);
|
|
row_right = verif_row_right(i, tab);
|
|
if (((i % area_size) == area_size - 1))
|
|
{
|
|
if (row_left != get_row()[i / area_size][0]
|
|
|| row_right != get_row()[i / area_size][1])
|
|
return (0);
|
|
}
|
|
else if (row_left > get_row()[i / area_size][0])
|
|
return (0);
|
|
return (1);
|
|
}
|
|
|
|
int verif_all_col(int i, int **tab)
|
|
{
|
|
int col_up;
|
|
int col_down;
|
|
int area_size;
|
|
|
|
area_size = get_area_size();
|
|
col_up = verif_col_up(i, tab);
|
|
col_down = verif_col_down(i, tab);
|
|
if (((i / area_size) == area_size - 1))
|
|
{
|
|
if (col_up != get_col()[i % area_size][0]
|
|
|| col_down != get_col()[i % area_size][1])
|
|
return (0);
|
|
}
|
|
else if (col_up > get_col()[i % area_size][0])
|
|
return (0);
|
|
return (1);
|
|
}
|
|
|
|
int verif(int i, int **tab)
|
|
{
|
|
if (!verif_non_double(i, tab))
|
|
return (0);
|
|
return (verif_all_row(i, tab) && verif_all_col(i, tab));
|
|
}
|
|
|
|
int is_possibility_valid(int **tab, int i)
|
|
{
|
|
int area_size;
|
|
|
|
area_size = get_area_size();
|
|
if (i == area_size * area_size - 1)
|
|
return (1);
|
|
else
|
|
return (ft_test_possibility(tab, i + 1));
|
|
}
|
|
|
|
int ft_test_possibility(int **tab, int i)
|
|
{
|
|
int area_size;
|
|
int height;
|
|
|
|
area_size = get_area_size();
|
|
if (tab[i / area_size][i % area_size] == 0)
|
|
{
|
|
height = 0;
|
|
while (++height <= area_size)
|
|
{
|
|
tab[i / area_size][i % area_size] = height;
|
|
if (verif(i, tab))
|
|
{
|
|
if (is_possibility_valid(tab, i))
|
|
return (1);
|
|
}
|
|
}
|
|
tab[i / area_size][i % area_size] = 0;
|
|
return (0);
|
|
}
|
|
else
|
|
{
|
|
if (!verif(i, tab))
|
|
return (0);
|
|
return (is_possibility_valid(tab, i));
|
|
}
|
|
}
|