aboutsummaryrefslogtreecommitdiff
path: root/c05/ex08/ft_ten_queens_puzzle.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-08-07 20:33:02 +0200
committerCharles <sircharlesaze@gmail.com>2019-08-07 20:33:02 +0200
commitaa34d515b7debdd8edf63fbdb58f2fa936ab9572 (patch)
tree52f703515d381942d334c631ef98985f7269ace9 /c05/ex08/ft_ten_queens_puzzle.c
parent687a7211a8702a4ad0645491b9001d243c8c3099 (diff)
downloadpiscine-aa34d515b7debdd8edf63fbdb58f2fa936ab9572.tar.gz
piscine-aa34d515b7debdd8edf63fbdb58f2fa936ab9572.tar.bz2
piscine-aa34d515b7debdd8edf63fbdb58f2fa936ab9572.zip
ten queens updated for current subject
Diffstat (limited to 'c05/ex08/ft_ten_queens_puzzle.c')
-rw-r--r--c05/ex08/ft_ten_queens_puzzle.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/c05/ex08/ft_ten_queens_puzzle.c b/c05/ex08/ft_ten_queens_puzzle.c
new file mode 100644
index 0000000..36d5402
--- /dev/null
+++ b/c05/ex08/ft_ten_queens_puzzle.c
@@ -0,0 +1,67 @@
+#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');
+ 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 *solution_counter)
+{
+ int i;
+
+ if (x == BOARD_SIZE)
+ {
+ print_cols(cols);
+ (*solution_counter)++;
+ return ;
+ }
+ i = -1;
+ while (++i < BOARD_SIZE)
+ {
+ if (!valid_position(cols, x, i))
+ continue ;
+ cols[x] = i;
+ solve(cols, x + 1, solution_counter);
+ }
+}
+
+int ft_ten_queens_puzzle(void)
+{
+ int solution_counter;
+ int cols[BOARD_SIZE];
+
+ solution_counter = 0;
+ solve(cols, 0, &solution_counter);
+ return (solution_counter);
+}