Annotation of 43BSD/contrib/icon/src/cmd/queens.icn, revision 1.1.1.1

1.1       root        1: #      QUEENS(6)
                      2: #
                      3: #      Solutions to n nonattacking queens
                      4: #
                      5: #      Stephen B. Wampler
                      6: #
                      7: #      Last modified 8/14/84
                      8: #
                      9: 
                     10: global n, solution
                     11: 
                     12: procedure main(args)
                     13:    local i
                     14:    n := args[1] | 6            # 6 queens by default
                     15:    if not(0 < integer(n)) then stop("parameter must be integer > 0")
                     16:    solution := list(n)         # ... and a list of column solutions
                     17:    write(n,"-Queens:")
                     18:    every q(1)                  # start by placing queen in first col.
                     19: end
                     20: 
                     21: # q(c) - place a queen in column c.
                     22: #
                     23: procedure q(c)
                     24:    local r
                     25:    static up, down, rows
                     26:    initial {
                     27:       up := list(2*n-1,0)
                     28:       down := list(2*n-1,0)
                     29:       rows := list(n,0)
                     30:       }
                     31:    every 0 = rows[r := 1 to n] = up[n+r-c] = down[r+c-1] &
                     32:       rows[r] <- up[n+r-c] <- down[r+c-1] <- 1        do {
                     33:          solution[c] := r      # record placement.
                     34:          if c = n then show()
                     35:          else q(c + 1)         # try to place next queen.
                     36:          }
                     37: end
                     38: 
                     39: # show the solution on a chess board.
                     40: #
                     41: procedure show()
                     42:    static count, line, border
                     43:    initial {
                     44:       count := 0
                     45:       line := repl("|   ",n) || "|"
                     46:       border := repl("----",n) || "-"
                     47:       }
                     48:    write("solution: ", count+:=1)
                     49:    write("  ", border)
                     50:    every line[4*(!solution - 1) + 3] <- "Q" do {
                     51:       write("  ", line)
                     52:       write("  ", border)
                     53:       }
                     54:    write()
                     55: end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.