diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-08-06 16:56:43 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-08-06 16:56:43 +0200 |
| commit | 056a88ee9c2c9e26f9712d14c645e367d851f394 (patch) | |
| tree | 52b54df3e809e1526325dd9123078a9cc01e9831 /c05/ex08 | |
| parent | e534578eecebd27c4e7e235ce85961446e6c2e43 (diff) | |
| download | piscine-056a88ee9c2c9e26f9712d14c645e367d851f394.tar.gz piscine-056a88ee9c2c9e26f9712d14c645e367d851f394.tar.bz2 piscine-056a88ee9c2c9e26f9712d14c645e367d851f394.zip | |
c05
- primality test correction for ft_is_prime and ft_find_next_prime
- queens puzzle solved with backtracking (similar to rush01)
Diffstat (limited to 'c05/ex08')
| -rw-r--r-- | c05/ex08/ft_queens.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/c05/ex08/ft_queens.c b/c05/ex08/ft_queens.c new file mode 100644 index 0000000..ba2c742 --- /dev/null +++ b/c05/ex08/ft_queens.c @@ -0,0 +1,62 @@ +#include <unistd.h> +#define TRUE 1 +#define FALSE 0 +#define BOARD_SIZE 10 +#define ABS(x) (x < 0 ? -(x) : x) + +void ft_putchar(char c) +{ + write(1, &c, 1); +} + +static void print_cols(int cols[BOARD_SIZE]) +{ + int i; + + i = 0; + while (i < BOARD_SIZE) + ft_putchar(cols[i++] + '0'); // maybe +1 + ft_putchar('\n'); +} + +static int valid_position(int cols[BOARD_SIZE], int x, int y) +{ + int i; + + i = 0; + while (i < x) + { + if (y == cols[i]) + return (FALSE); + if (ABS(x - i) == ABS(y - cols[i])) + return (FALSE); + i++; + } + return (TRUE); +} + +static void solve(int cols[BOARD_SIZE], int x) +{ + int i; + + if (x == BOARD_SIZE) + { + print_cols(cols); + return ; + } + i = -1; + while (++i < BOARD_SIZE) + { + if (!valid_position(cols, x, i)) + continue ; + cols[x] = i; + solve(cols, x + 1); + } +} + +void ft_queens(void) // may have bad name +{ + int cols[BOARD_SIZE]; + + solve(cols, 0); +} |
