#! /usr/bin/env python """N queens problem. The (well-known) problem is due to Niklaus Wirth. This solution is inspired by Dijkstra (Structured Programming). It is a classic recursive backtracking approach. """ N = 8 # Default; command line overrides class Queens: def __init__(self, n=N): self.n = n self.reset() def reset(self): n = self.n self.y = [None] * n # Where is the queen in column x self.row = [0] * n # Is row[y] safe? self.up = [0] * (2*n-1) # Is upward diagonal[x-y] safe? self.down = [0] * (2*n-1) # Is downward diagonal[x+y] safe? self.nfound = 0 # Instrumentation def solve(self, x=0): # Recursive solver for y in range(self.n): if self.safe(x, y): self.place(x, y) if x+1 == self.n: self.display() else: self.solve(x+1) self.remove(x, y) def safe(self, x, y): return not self.row[y] and not self.up[x-y] and not self.down[x+y] def place(self, x, y): self.y[x] = y self.row[y] = 1 self.up[x-y] = 1 self.down[x+y] = 1 def remove(self, x, y): self.y[x] = None self.row[y] = 0 self.up[x-y] = 0 self.down[x+y] = 0 silent = 0 # If true, count solutions only def display(self): self.nfound = self.nfound + 1 if self.silent: return print '+-' + '--'*self.n + '+' for y in range(self.n-1, -1, -1): print '|', for x in range(self.n): if self.y[x] == y: print "Q", else: print ".", print '|' print '+-' + '--'*self.n + '+' def main(): import sys silent = 0 n = N if sys.argv[1:2] == ['-n']: silent = 1 del sys.argv[1] if sys.argv[1:]: n = int(sys.argv[1]) q = Queens(n) q.silent = silent q.solve() print "Found", q.nfound, "solutions." if __name__ == "__main__": main()
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
.beer.pyo.40009 | File | 703 B | 0644 |
|
.eqfix.pyo.40009 | File | 4.52 KB | 0644 |
|
.fact.pyo.40009 | File | 1.14 KB | 0644 |
|
.find-uname.pyo.40009 | File | 1.47 KB | 0644 |
|
.from.pyo.40009 | File | 749 B | 0644 |
|
.lpwatch.pyo.40009 | File | 2.54 KB | 0644 |
|
.makedir.pyo.40009 | File | 732 B | 0644 |
|
.markov.pyo.40009 | File | 3.93 KB | 0644 |
|
.mboxconvert.pyo.40009 | File | 3.17 KB | 0644 |
|
.morse.pyo.40009 | File | 4.33 KB | 0644 |
|
.newslist.pyo.40009 | File | 7.55 KB | 0644 |
|
.pi.pyo.40009 | File | 921 B | 0644 |
|
.pp.pyo.40009 | File | 2.28 KB | 0644 |
|
.primes.pyo.40009 | File | 921 B | 0644 |
|
.queens.pyo.40009 | File | 2.95 KB | 0644 |
|
.script.pyo.40009 | File | 1.21 KB | 0644 |
|
.unbirthday.pyo.40009 | File | 2.93 KB | 0644 |
|
.update.pyo.40009 | File | 2.69 KB | 0644 |
|
README | File | 1009 B | 0644 |
|
beer.py | File | 459 B | 0755 |
|
beer.pyc | File | 703 B | 0644 |
|
beer.pyo | File | 703 B | 0644 |
|
eqfix.py | File | 6.16 KB | 0755 |
|
eqfix.pyc | File | 4.52 KB | 0644 |
|
eqfix.pyo | File | 4.52 KB | 0644 |
|
fact.py | File | 1.11 KB | 0755 |
|
fact.pyc | File | 1.14 KB | 0644 |
|
fact.pyo | File | 1.14 KB | 0644 |
|
find-uname.py | File | 1.18 KB | 0755 |
|
find-uname.pyc | File | 1.47 KB | 0644 |
|
find-uname.pyo | File | 1.47 KB | 0644 |
|
from.py | File | 874 B | 0755 |
|
from.pyc | File | 749 B | 0644 |
|
from.pyo | File | 749 B | 0644 |
|
lpwatch.py | File | 2.77 KB | 0755 |
|
lpwatch.pyc | File | 2.54 KB | 0644 |
|
lpwatch.pyo | File | 2.54 KB | 0644 |
|
makedir.py | File | 510 B | 0755 |
|
makedir.pyc | File | 732 B | 0644 |
|
makedir.pyo | File | 732 B | 0644 |
|
markov.py | File | 3.51 KB | 0755 |
|
markov.pyc | File | 3.93 KB | 0644 |
|
markov.pyo | File | 3.93 KB | 0644 |
|
mboxconvert.py | File | 3.11 KB | 0755 |
|
mboxconvert.pyc | File | 3.17 KB | 0644 |
|
mboxconvert.pyo | File | 3.17 KB | 0644 |
|
morse.py | File | 4.21 KB | 0755 |
|
morse.pyc | File | 4.33 KB | 0644 |
|
morse.pyo | File | 4.33 KB | 0644 |
|
newslist.doc | File | 2.36 KB | 0755 |
|
newslist.py | File | 11.17 KB | 0755 |
|
newslist.pyc | File | 7.55 KB | 0644 |
|
newslist.pyo | File | 7.55 KB | 0644 |
|
pi.py | File | 888 B | 0755 |
|
pi.pyc | File | 921 B | 0644 |
|
pi.pyo | File | 921 B | 0644 |
|
pp.py | File | 3.73 KB | 0755 |
|
pp.pyc | File | 2.28 KB | 0644 |
|
pp.pyo | File | 2.28 KB | 0644 |
|
primes.py | File | 603 B | 0755 |
|
primes.pyc | File | 921 B | 0644 |
|
primes.pyo | File | 921 B | 0644 |
|
queens.py | File | 2.19 KB | 0755 |
|
queens.pyc | File | 2.95 KB | 0644 |
|
queens.pyo | File | 2.95 KB | 0644 |
|
script.py | File | 962 B | 0755 |
|
script.pyc | File | 1.21 KB | 0644 |
|
script.pyo | File | 1.21 KB | 0644 |
|
unbirthday.py | File | 3.07 KB | 0755 |
|
unbirthday.pyc | File | 2.93 KB | 0644 |
|
unbirthday.pyo | File | 2.93 KB | 0644 |
|
update.py | File | 2.69 KB | 0755 |
|
update.pyc | File | 2.69 KB | 0644 |
|
update.pyo | File | 2.69 KB | 0644 |
|