# Eight Queens

## Kata

This kata is based on the classic chess rules. You must put eight chess queens on an 8×8 chessboard such that none of them is able to capture any other using the standard chess queen’s moves.

Tips: you could have only one queen by row and column.

### Step 1

Use multiple TDD loops to build a programm they find all solutions.

### Tree traversal

- Rewrite a new programm to use a Depth-first walk.
- Rewrite a new programm to use a Breadth-first walk.
- Compare performances and lisibility

### Nontraditional approaches

In this part we whant to find only one solution.

- Use a genetic algorithms to solve this puzzle.
- Use a minimum-conflicts heuristic to solve this puzzle.
- Use other metaheuristic algorithms like Simulated annealing or random to solve this puzzle.
- Compare performances

### Brute-force

- Build a programm they use brute-force and compare performances

## ⚠️ Spoiler: the next part is a technical solution ⚠️

### Brute-force

#### Vertical and horizontal rules

Given a chessboard, you can code each line of board by one byte of 8 bits, with 0 for empty cell and 1 for a queen.

```
+---+---+---+---+---+---+---+---+
| ♛ | | | | | | | |
+---+---+---+---+---+---+---+---+
```

Could be encoded by 10000000 i.e 128. To know if 2 row contains 2 quens, it’s possible to use the OR operator. For a 8×8 chessboard, you must have only 1 in the result i.e. 255.

Sample with a 4×4 board

```
+---+---+---+---+
| | ♛ | | |
+---+---+---+---+
| | | | ♛ |
+---+---+---+---+
| ♛ | | | |
+---+---+---+---+
| | | ♛ | |
+---+---+---+---+
```

0100 OR 0001 OR 1000 OR 0010 = 1111

#### Diagonals rules

Diagonals could be check with 16bits with one shift by line :

```
+---+---+---+---+ +---+---+---+---++---+---+---+---+
| | | | ♛ | Line 0 => no shift | | | | || | | | ♛ |
+---+---+---+---+ +---+---+---+---++---+---+---+---+
| | ♛ | | | Line 1 => 1 shift | | | | || ♛ < . | | |
+---+---+---+---+ +---+---+---+---++---+---+---+---+
| | | ♛ | | Line 2 => 2 shifts | | | | || ♛ < < . | |
+---+---+---+---+ +---+---+---+---++---+---+---+---+
| ♛ | | | | Line 3 => 3 shifts | | ♛ < < << . | | | |
+---+---+---+---+ +---+---+---+---++---+---+---+---+
```

Could be test with :

00000001 OR 00001000 OR 00001000 OR 01000000 = 01001001

- Implement a programm they use this optimized check solution to find all solutions by brute-force.
- Compare performance with others implementations