n-damen.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. def get_next(n, i, damen_pos):
  4. for i in range(n):
  5. candidates = set(list(range(n)))
  6. candidates -= set(damen_pos)
  7. candidates -= set(list(range(damen_pos[i]+1)))
  8. candidates = list(candidates)
  9. if len(candidates) > 0:
  10. damen_pos[i] = candidates[0]
  11. return i, damen_pos
  12. else:
  13. damen_pos = damen_pos[0:i] + [0]*(n-i)
  14. i -= 1
  15. def is_attacked(damen, x, y):
  16. """ Wird das Feld (x,y) von einer der Damen angegriffen? """
  17. for dy, dx in enumerate(damen[:y]):
  18. if dx == x or dy == y or abs(x-dx) == abs(y-dy):
  19. return True
  20. return False
  21. def finde_loesung(n):
  22. """ Platziere n Damen so auf einem n×n Feld,
  23. sodass sich keine Damen schlagen.
  24. """
  25. # damen[i] ist die x-position von Dame i in Zeile i
  26. damen = [0]*n
  27. i = 1
  28. solutions = []
  29. while 0 <= i < n:
  30. while not is_attacked(damen, damen[i], i):
  31. if i == n-1:
  32. yield damen
  33. break
  34. i += 1
  35. i, damen = get_next(n, i, damen)
  36. def alle_loesungen(n):
  37. generator = finde_loesung(n)
  38. return list(generator)
  39. print(len(alle_loesungen(11)))