#!/usr/bin/env python3"""N queens problem.The (well-known) problem is due to Niklaus Wirth.This solution is inspired by Dijkstra (Structured Programming). It isa classic recursive backtracking approach."""N = 8 # Default; command line overridesclass Queens:def __init__(self, n=N):self.n = nself.reset()def reset(self):n = self.nself.y = [None] * n # Where is the queen in column xself.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 # Instrumentationdef solve(self, x=0): # Recursive solverfor 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] = yself.row[y] = 1self.up[x-y] = 1self.down[x+y] = 1def remove(self, x, y):self.y[x] = Noneself.row[y] = 0self.up[x-y] = 0self.down[x+y] = 0silent = 0 # If true, count solutions onlydef display(self):self.nfound = self.nfound + 1if self.silent:returnprint('+-' + '--'*self.n + '+')for y in range(self.n-1, -1, -1):print('|', end=' ')for x in range(self.n):if self.y[x] == y:print("Q", end=' ')else:print(".", end=' ')print('|')print('+-' + '--'*self.n + '+')def main():import syssilent = 0n = Nif sys.argv[1:2] == ['-n']:silent = 1del sys.argv[1]if sys.argv[1:]:n = int(sys.argv[1])q = Queens(n)q.silent = silentq.solve()print("Found", q.nfound, "solutions.")if __name__ == "__main__":main()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。