84 lines
1.1 KiB
C
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);
|
|
} |