EX_03/n_queens/n_queens.c
2025-09-22 17:29:05 +01:00

84 lines
1.1 KiB
C

#include "n_queens.h"
void print_number(int n)
{
char c;
if (n >= 10)
print_number(n / 10);
c = '0' + (n % 10);
write(1, &c, 1);
}
void print_solution(int *queens, int n)
{
int i;
i = 0;
while (i < n)
{
if (i > 0)
write(1, " ", 1);
print_number(queens[i]);
i++;
}
write(1, "\n", 1);
}
int is_safe(int *queens, int row, int col, int n)
{
int i;
(void)n;
i = 0;
while (i < row)
{
if (queens[i] == col)
return (0);
if (queens[i] - i == col - row)
return (0);
if (queens[i] + i == col + row)
return (0);
i++;
}
return (1);
}
void solve_nqueens(int *queens, int row, int n)
{
int col;
if (row == n)
{
print_solution(queens, n);
return ;
}
col = 0;
while (col < n)
{
if (is_safe(queens, row, col, n))
{
queens[row] = col;
solve_nqueens(queens, row + 1, n);
}
col++;
}
}
int main(int argc, char **argv)
{
int n;
int *queens;
if (argc != 2)
return (1);
n = atoi(argv[1]);
if (n <= 0)
return (1);
queens = (int *)malloc(sizeof(int) * n);
if (!queens)
return (1);
solve_nqueens(queens, 0, n);
free(queens);
return (0);
}