2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-26 06:48:04 +02:00
LaTeX-examples/documents/Programmierparadigmen/scripts/python/n-damen.py

49 lines
1.2 KiB
Python
Raw Normal View History

2014-03-18 15:45:40 +01:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2015-11-20 23:12:22 +01:00
2014-03-18 15:45:40 +01:00
def get_next(n, i, damen_pos):
for i in range(n):
2015-11-20 23:12:22 +01:00
candidates = set(list(range(n)))
2014-03-18 15:45:40 +01:00
candidates -= set(damen_pos)
candidates -= set(list(range(damen_pos[i]+1)))
2015-11-20 23:12:22 +01:00
candidates = list(candidates)
2014-03-18 15:45:40 +01:00
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
2015-11-20 23:12:22 +01:00
2014-03-18 15:45:40 +01:00
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
2015-11-20 23:12:22 +01:00
2014-03-18 15:45:40 +01:00
def finde_loesung(n):
""" Platziere n Damen so auf einem n×n Feld,
2015-11-20 23:12:22 +01:00
sodass sich keine Damen schlagen.
2014-03-18 15:45:40 +01:00
"""
# 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)
2015-11-20 23:12:22 +01:00
2014-03-18 15:45:40 +01:00
def alle_loesungen(n):
generator = finde_loesung(n)
return list(generator)
2015-11-20 23:12:22 +01:00
print(len(alle_loesungen(11)))