1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- def get_next(n, i, damen_pos):
- for i in range(n):
- candidates = set(list(range(n)))
- candidates -= set(damen_pos)
- candidates -= set(list(range(damen_pos[i]+1)))
- candidates = list(candidates)
- if len(candidates) > 0:
- damen_pos[i] = candidates[0]
- return i, damen_pos
- else:
- damen_pos = damen_pos[0:i] + [0]*(n-i)
- i -= 1
- def is_attacked(damen, x, y):
- """ Wird das Feld (x,y) von einer der Damen angegriffen? """
- for dy, dx in enumerate(damen[:y]):
- if dx == x or dy == y or abs(x-dx) == abs(y-dy):
- return True
- return False
- def finde_loesung(n):
- """ Platziere n Damen so auf einem n×n Feld,
- sodass sich keine Damen schlagen.
- """
- # damen[i] ist die x-position von Dame i in Zeile i
- damen = [0]*n
- i = 1
- solutions = []
- while 0 <= i < n:
- while not is_attacked(damen, damen[i], i):
- if i == n-1:
- yield damen
- break
- i += 1
- i, damen = get_next(n, i, damen)
- def alle_loesungen(n):
- generator = finde_loesung(n)
- return list(generator)
- print(len(alle_loesungen(11)))
|