mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-26 06:48:04 +02:00
44 lines
1.2 KiB
Python
44 lines
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)))
|