N-queens problem: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: use pygments) |
m (→Python: backtracking on permutations: Small speed and readability improvements (Python can handle negative indexes)) |
||
Line 12,866: | Line 12,866: | ||
<syntaxhighlight lang="python">def queens(n): |
<syntaxhighlight lang="python">def queens(n): |
||
⚫ | |||
def queen(i): |
|||
if i < n: |
|||
def sub(i): |
|||
⚫ | |||
yield tuple(a) |
|||
else: |
|||
for k in range(i, n): |
for k in range(i, n): |
||
j = a[k] |
l, j = a[i], a[k] |
||
if b[i + j] and c[i - j]: |
|||
b[i + j] = c[i - j] = False |
|||
a[i], a[k] = j, l |
|||
yield from queen(i + 1) |
|||
a[i], a[k] = |
a[i], a[k] = l, j |
||
b[i + j] = c[i - j] = True |
|||
⚫ | |||
up[p] = down[q] = True |
|||
yield a |
|||
⚫ | |||
⚫ | |||
⚫ | |||
b = [True] * (2 * n - 1) |
|||
c = [True] * (2 * n - 1) |
|||
⚫ | |||
⚫ | |||
sum(1 for p in queens(8)) |
sum(1 for p in queens(8)) |
||
92</syntaxhighlight> |
92</syntaxhighlight> |
||
Line 12,894: | Line 12,895: | ||
<syntaxhighlight lang="python">def queens_lex(n): |
<syntaxhighlight lang="python">def queens_lex(n): |
||
a = list(range(n)) |
|||
def queen(i): |
|||
if i < n: |
|||
def sub(i): |
|||
if i == n: |
|||
yield tuple(a) |
|||
else: |
|||
for k in range(i, n): |
for k in range(i, n): |
||
l, j = a[i], a[k] |
|||
a[i], a[k] = j, l |
|||
if b[i + j] and c[i - j]: |
|||
b[i + j] = c[i - j] = False |
|||
yield from queen(i + 1) |
|||
b[i + j] = c[i - j] = True |
|||
a[i:(n - 1)] = a[(i + 1):n] |
|||
a[n - 1] = j |
|||
else: |
|||
yield a |
|||
a[k - 1] = a[k] |
|||
a = list(range(n)) |
|||
b = [True] * (2 * n - 1) |
|||
c = [True] * (2 * n - 1) |
|||
yield from queen(0) |
|||
next(queens(31)) |
next(queens(31)) |
||
[0, 2, 4, 1, 3, 8, 10, 12, 14, 6, 17, 21, 26, 28, 25, 27, 24, 30, 7, 5, 29, 15, 13, 11, 9, 18, 22, 19, 23, 16, 20] |
|||
next(queens_lex(31)) |
next(queens_lex(31)) |
||
[0, 2, 4, 1, 3, 8, 10, 12, 14, 5, 17, 22, 25, 27, 30, 24, 26, 29, 6, 16, 28, 13, 9, 7, 19, 11, 15, 18, 21, 23, 20] |
|||
#Compare to A065188 |
#Compare to A065188 |