mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-25 14:28:05 +02:00
44 lines
No EOL
1.2 KiB
Python
44 lines
No EOL
1.2 KiB
Python
#!/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))) |