summaryrefslogtreecommitdiff
path: root/ipl/gprogs/vqueens.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gprogs/vqueens.icn')
-rw-r--r--ipl/gprogs/vqueens.icn222
1 files changed, 222 insertions, 0 deletions
diff --git a/ipl/gprogs/vqueens.icn b/ipl/gprogs/vqueens.icn
new file mode 100644
index 0000000..585a682
--- /dev/null
+++ b/ipl/gprogs/vqueens.icn
@@ -0,0 +1,222 @@
+############################################################################
+#
+# File: vqueens.icn
+#
+# Subject: Program to display solutions to the n-queens problem
+#
+# Author: Ralph E. Griswold
+#
+# Date: January 5, 1997
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Adapted from a text-display version by Steve Wampler.
+#
+############################################################################
+#
+# Requires: Version 9 graphics
+#
+############################################################################
+#
+# Links: options, wopen
+#
+############################################################################
+
+link options
+link wopen
+
+global solution
+global black_queen, white_queen
+
+$define Edge 4
+$define Offset 40
+$define Size 44
+
+global queens
+
+procedure main(args)
+ local i, opts, wsize, bqueen, wqueen
+
+ opts := options(args,"n+")
+ queens := \opts["n"] | 8
+ if queens <= 0 then stop("-n needs a positive numeric parameter")
+ wsize := queens * Size + 2 * Offset
+
+
+ WOpen("size=" || wsize || "," || wsize, "label=" || queens ||
+ "-queens") | stop("*** cannot open window")
+ black_queen := WOpen("canvas=hidden", "size=41,41") |
+ stop("*** cannot open window for black queen")
+ white_queen := WOpen("canvas=hidden", "size=41,41") |
+ stop("*** cannot open window for white queen")
+
+ DrawImage(black_queen, 0, 0,
+ "41,c1,_
+ 66666666666666666666666666666666666666666_
+ 66666666666666666666666666666666666666666_
+ 66666666666666666666666666666666666666666_
+ 66666666666664003666666663004666666666666_
+ 66666666666650000466666640000566666666666_
+ 66666666666640000366666630000466666666666_
+ 66666666666660000566666650000666666666666_
+ 66666666666665224666666664225666666666666_
+ 66663346666666644666666664466666666433666_
+ 66620004666666631666666661366666664000266_
+ 66600002666666640666666660466666662000066_
+ 66600003666666650466666640566666663000066_
+ 66640026666666660166666610666666666200466_
+ 66666651666666660046666400666666661566666_
+ 66666662266666660026666200666666622666666_
+ 66666666036666660004663000666666306666666_
+ 66666666403666640000220000466663046666666_
+ 66666666620266620000000000266620266666666_
+ 66666666650002100000000000012000566666666_
+ 66666666663000000000000000000003666666666_
+ 66666666666000000000000000000006666666666_
+ 66666666666300000000000000000036666666666_
+ 66666666666500000000000000000056666666666_
+ 66666666666610000000000000000166666666666_
+ 66666666666630000000000000000366666666666_
+ 66666666666652222222222222222566666666666_
+ 66666666666664444444444444444666666666666_
+ 66666666666640000000000000000466666666666_
+ 66666666666651000000000000001566666666666_
+ 66666666666664000000000000004666666666666_
+ 66666666666651000000000000001566666666666_
+ 66666666666640000000000000000466666666666_
+ 66666666666664444444444444444666666666666_
+ 66666666653222222222222222222223566666666_
+ 66666666600000000000000000000000066666666_
+ 66666666400000000000000000000000046666666_
+ 66666666300000000000000000000000036666666_
+ 66666666300000000000000000000000036666666_
+ 66666666300000000000000000000000036666666_
+ 66666666300000000000000000000000036666666_
+ 66666666666666666666666666666666666666666_
+ ")
+
+ DrawImage(white_queen, 0, 0,
+ "41,c1,_
+ 00000000000000000000000000000000000000000_
+ 00000000000000000000000000000000000000000_
+ 00000000000026630000000036620000000000000_
+ 00000000000166662000000266661000000000000_
+ 00000000000266663000000366662000000000000_
+ 00000000000066661000000166660000000000000_
+ 00000000000014420000000024410000000000000_
+ 00033200000000220000000022000000002330000_
+ 00466620000000350000000053000000026664000_
+ 00666640000000260000000062000000046666000_
+ 00666630000000162000000261000000036666000_
+ 00266400000000065000000560000000004662000_
+ 00000150000000066200002660000000051000000_
+ 00000044000000066400004660000000440000000_
+ 00000006300000066620036660000003600000000_
+ 00000002630000266664466662000036200000000_
+ 00000000464000466666666664000464000000000_
+ 00000000166645666666666666546661000000000_
+ 00000000036666666666666666666630000000000_
+ 00000000006666666666666666666600000000000_
+ 00000000003666666666666666666300000000000_
+ 00000000001666666666666666666100000000000_
+ 00000000000566666666666666665000000000000_
+ 00000000000366666666666666663000000000000_
+ 00000000000144444444444444441000000000000_
+ 00000000000022222222222222220000000000000_
+ 00000000000266666666666666662000000000000_
+ 00000000000156666666666666651000000000000_
+ 00000000000026666666666666620000000000000_
+ 00000000000156666666666666651000000000000_
+ 00000000000266666666666666662000000000000_
+ 00000000000022222222222222220000000000000_
+ 00000000134444444444444444444431000000000_
+ 00000000666666666666666666666666000000000_
+ 00000002666666666666666666666666200000000_
+ 00000003666666666666666666666666300000000_
+ 00000003666666666666666666666666300000000_
+ 00000003666666666666666666666666300000000_
+ 00000003666666666666666666666666300000000_
+ 00000000000000000000000000000000000000000_
+ 00000000000000000000000000000000000000000_
+ ")
+
+ DrawBoard()
+
+ solution := list(queens) # ... and a list of column solutions
+
+ every q(1) # start by placing queen in first column
+
+ until WQuit()
+
+end
+
+# q(c) - place a queen in column c.
+#
+procedure q(c)
+ local r
+ static up, down, rows
+ initial {
+ up := list(2 * queens - 1, 0)
+ down := list(2 * queens - 1, 0)
+ rows := list(queens, 0)
+ }
+ every 0 = rows[r := 1 to queens] = up[queens+r-c] = down[r+c-1] &
+ rows[r] <- up[queens+r-c] <- down[r+c-1] <- 1 do {
+ solution[c] := r # record placement.
+ if c = queens then show()
+ else q(c + 1) # try to place next queen.
+ }
+end
+
+# show the solution on a chess board.
+#
+procedure show()
+ local i, j, queen
+
+ every i := 1 to *solution do {
+ j := solution[i]
+ queen := if (i + j) % 2 = 0 then black_queen else white_queen
+ CopyArea(queen, &window, , , , , Offset + (i - 1) * Size + 1,
+ Offset + (j - 1) * Size + 1)
+ }
+
+ WDelay(500)
+
+ while *Pending() > 0 do {
+ case Event() of {
+ "q": exit()
+ "p": until Event() === "c"
+ }
+ }
+
+ every i := 1 to *solution do {
+ j := solution[i]
+ if (i + j) % 2 = 1 then Fg("black") else Fg("white")
+ FillRectangle(Offset + (i - 1) * Size, Offset + (j - 1) * Size,
+ Size, Size)
+ }
+
+ return
+
+end
+
+procedure DrawBoard()
+ local i, j
+
+ every i := 0 to queens - 1 do
+ every j := 0 to queens - 1 do
+ if (i + j) % 2 = 1 then
+ FillRectangle(Offset + i * Size, Offset + j * Size,
+ Size, Size)
+ DrawRectangle(Offset - 1, Offset - 1, queens * Size + 1,
+ queens * Size + 1)
+ DrawRectangle(Offset - Edge - 1, Offset - Edge - 1,
+ queens * Size + 2 * Edge + 1, queens * Size + 2 * Edge + 1)
+
+ return
+
+end