Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

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