diff options
| author | Syndamia <kamen.d.mladenov@protonmail.com> | 2020-09-18 21:43:44 +0300 |
|---|---|---|
| committer | Syndamia <kamen.d.mladenov@protonmail.com> | 2020-09-18 21:43:44 +0300 |
| commit | 2c63f2b94833bcf6d92aad883fffe4cc61e009ef (patch) | |
| tree | c01ff1e68bdfd18d1c3c947a96e045804dd4dafe /Perl/queens.pl | |
| parent | dfeae88ed358ab6a3981518f2d40d8a5c405c2fd (diff) | |
| download | algorithms-2c63f2b94833bcf6d92aad883fffe4cc61e009ef.tar algorithms-2c63f2b94833bcf6d92aad883fffe4cc61e009ef.tar.gz algorithms-2c63f2b94833bcf6d92aad883fffe4cc61e009ef.zip | |
Added the queens perl scripts and a gitignore
Diffstat (limited to 'Perl/queens.pl')
| -rw-r--r-- | Perl/queens.pl | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/Perl/queens.pl b/Perl/queens.pl new file mode 100644 index 0000000..81055b9 --- /dev/null +++ b/Perl/queens.pl @@ -0,0 +1,70 @@ +#!/usr/bin/perl +#!/data/data/com.termux/files/usr/bin/perl + +if (grep(/^$ARGV[0]$/, ('h', '-h', '--help'))) { + print "queens.pl BOARD_SIZE EMPTY_CHAR QUEEN_CHAR\n"; + exit; +} + +($board_size, $empty, $queen) = (shift // 8, shift // '.', shift // 'Q'); +(@board, $solutions); + +place_queen(); + +sub place_queen { + my $row = shift // 0; + + if ($row == $board_size) { + $solutions++; + print_solution(); + return; + } + + foreach my $col (0 .. $board_size - 1) { + if ($board[$row * $board_size + $col] == 0) { + mark($row, $col, 1); + place_queen($row + 1); + mark($row, $col, -1); + } + } +} + +sub mark($$$) { + my ($row, $col, $value) = @_; + + foreach my $o (0 .. $board_size - 1) { + $board[$row * $board_size + $o] += $value; # row + $board[$o * $board_size + $col] += $value; # column + + # diagonals + my ($row_above, $row_below) = ($row - $o, $row + $o); + my ($col_left , $col_right) = ($col - $o, $col + $o); + + if ($row_above >= 0 && $col_right < $board_size) { + $board[$row_above * $board_size + $col_right] += $value; + } + if ($row_above >= 0 && $col_left >= 0) { + $board[$row_above * $board_size + $col_left] += $value; + } + if ($row_below < $board_size && $col_left >= 0) { + $board[$row_below * $board_size + $col_left] += $value; + } + if ($row_below < $board_size && $col_right < $board_size) { + $board[$row_below * $board_size + $col_right] += $value; + } + } + $board[$row * $board_size + $col] += $value; +} + +sub print_solution { + print "Solution number $solutions:\n"; + + foreach my $row (0 .. $board_size - 1) { + foreach my $col (0 .. $board_size - 1) { + print(($board[$row * $board_size + $col] == 7) ? $queen : $empty); + } + print "\n"; + } + + print "\n"; +} |
