Board::isBlocked()   A
last analyzed

Complexity

Conditions 5
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 7
c 1
b 0
f 0
nc 3
nop 3
dl 0
loc 15
rs 9.6111
1
<?php declare(strict_types=1);
2
3
namespace Stratadox\PuzzleSolver\Puzzle\NQueens;
4
5
use Stratadox\PuzzleSolver\Moves;
6
use function array_slice;
7
use function count;
8
use function end;
9
use function implode;
10
use function range;
11
use function str_repeat;
12
use const PHP_EOL;
13
14
final class Board
15
{
16
    /** @var int */
17
    private $size;
18
19
    private function __construct(int $size)
20
    {
21
        $this->size = $size;
22
    }
23
24
    public static function ofSize(int $n): self
25
    {
26
        return new self($n);
27
    }
28
29
    public function isSolvedWith(QueenPlacement ...$queens): bool
30
    {
31
        return count($queens) === $this->size;
32
    }
33
34
    public function possibleMovesAfter(QueenPlacement ...$queens): Moves
35
    {
36
        $row = empty($queens) ? 0 : (end($queens)->row() + 1);
37
        $moves = [];
38
        foreach (range(0, $this->size - 1) as $column) {
39
            if (!$this->isBlocked($row, $column, ...$queens)) {
40
                $moves[] = new QueenPlacement($row, $column);
41
            }
42
        }
43
        return new Moves(...$moves);
44
    }
45
46
    private function isBlocked(
47
        int $row,
48
        int $column,
49
        QueenPlacement ...$queens
50
    ): bool {
51
        foreach ($queens as $queen) {
52
            if (
53
                $queen->column() === $column ||
54
                $queen->row() === $row ||
55
                abs($queen->row() - $row) === abs($queen->column() - $column)
56
            ) {
57
                return true;
58
            }
59
        }
60
        return false;
61
    }
62
63
    public function __toString(): string
64
    {
65
        $board = '  ' . implode('  ', array_slice(range('a', 'z'), 0, $this->size)) . PHP_EOL;
66
        foreach (range($this->size, 0, -1) as $i) {
67
            $board .= $i . ' ' . str_repeat('   ', $this->size) . PHP_EOL;
68
        }
69
        return $board;
70
    }
71
}
72