-1

I'm trying to make a solution for the n queens problem and I want to make a code writing a number of possible solutions for a n X n board and n queens.

Here is my code:

n = int(input())
piony = [[False for i in range(n)] for j in range(n)]
skosy_lp = [[False for i in range(n)] for j in range(n)]
skosy_pl = [[False for i in range(n)] for j in range(n)]
figury = [-1] * n
counter = 0
layer = 0
#list creating etc. piony list is containing vertical lines occupied by queens, skosy_lp
#is containing lines oblique from left to right, skosy_pl - from right to left.
#this is a backtracking algorithm
#figury list is containing positions of queens. -1 means that the queen isn't placed
while True:
    if layer == -1:
        break
    piony[layer] = piony[layer-1]
    skosy_pl[layer] = skosy_pl[layer-1]
    skosy_pl[layer].append(False)
    skosy_pl[layer].pop(0)
    skosy_lp[layer] = skosy_lp[layer-1]
    skosy_lp[layer].insert(0, False)
    skosy_lp[layer].pop(n)
    figury[layer]+=1
    while figury[layer] < n and (piony[layer][figury[layer]] or skosy_lp[layer][figury[layer]]or skosy_lp[layer][figury[layer]]):
        figury[layer] +=1
    if figury[layer] == n:
        figury[layer] = -1
        piony[layer] = [False] * n
        skosy_pl[layer] = [False] * n
        skosy_lp[layer] = [False] * n
        layer-=1
    else:
        if layer == n-1:
            counter+=1
            layer-=1
        else:
            print(piony)
            #I think there is a bug
            piony[layer][figury[layer]] = True
            skosy_pl[layer][figury[layer]] = True
            skosy_lp[layer][figury[layer]] = True
            layer+=1

When I stop a program in the middle, I discover that when I make piony[layer][figury[layer]] = True for layer = 0 (and figury[layer] = 0) the program is changing piony[0][0] and piony[-1][0].

Can someone tell me why and how to fix it?

mkrieger1
  • 19,194
  • 5
  • 54
  • 65

1 Answers1

0

When you do piony[layer] = piony[layer-1] (and later skosy_pl[layer] = skosy_pl[layer-1]), you are creating two different references in the outer list to the same inner list. That isn't what you seem to expect, as you modify the list through one of the references and are surprised to see the modifications through the other reference too.

To avoid this issue, make sure you're making a new copy of the list. The traditional way of doing that is via a slice:

piony[layer] = piony[layer-1][:]  # [:] causes the whole list to be sliced.

You could instead us copy.copy() or the list() constructor to make the copy, if you prefer to be more explicit about it

Blckknght
  • 100,903
  • 11
  • 120
  • 169