aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSyndamia <kamen.d.mladenov@protonmail.com>2020-09-18 21:43:44 +0300
committerSyndamia <kamen.d.mladenov@protonmail.com>2020-09-18 21:43:44 +0300
commit2c63f2b94833bcf6d92aad883fffe4cc61e009ef (patch)
treec01ff1e68bdfd18d1c3c947a96e045804dd4dafe
parentdfeae88ed358ab6a3981518f2d40d8a5c405c2fd (diff)
downloadalgorithms-2c63f2b94833bcf6d92aad883fffe4cc61e009ef.tar
algorithms-2c63f2b94833bcf6d92aad883fffe4cc61e009ef.tar.gz
algorithms-2c63f2b94833bcf6d92aad883fffe4cc61e009ef.zip
Added the queens perl scripts and a gitignore
-rw-r--r--.gitignore1
-rw-r--r--Perl/queens.pl70
2 files changed, 71 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1377554
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.swp
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";
+}