aboutsummaryrefslogtreecommitdiff
path: root/c05/ex08
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-08-06 16:56:43 +0200
committerCharles <sircharlesaze@gmail.com>2019-08-06 16:56:43 +0200
commit056a88ee9c2c9e26f9712d14c645e367d851f394 (patch)
tree52b54df3e809e1526325dd9123078a9cc01e9831 /c05/ex08
parente534578eecebd27c4e7e235ce85961446e6c2e43 (diff)
downloadpiscine-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.c62
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);
+}