我正在尝试解决Lights Out难题。我使用布尔值的二维列表(例如String brackets = "[\\[\\]]";
ProductList.productAdded.get(i).keySet().toString().replaceAll(brackets,"");
)来表示光源的状态。
我想反转给定位置(例如(1,1))的布尔值,我的代码为:
[[True, True, True], [True, True, True], [True, True, True]]
我在上调用perform_move(1,1)
class LightsOutPuzzle(object):
def __init__(self, board):
self.board = board
def get_board(self):
return self.board
def perform_move(self, row, col):
self.board[row][col] = not self.board[row][col]
print(self.board)
return LightsOutPuzzle(self.board)
但结果是:
[[False, False, False], [False, False, False], [False, False, False]]
这让我感到困惑。你能告诉我这是怎么回事吗?什么是完成此任务的正确方法? 非常感谢您的帮助!
我正在使用此功能来生成新板子:
[[False, True, False], [False, True, False], [False, True, False]]
是否会引起问题?
非常感谢您的答复!!! QWQ
答案 0 :(得分:1)
我在您的代码中看到的探测语句位于函数 def create_puzzle(rows,cols)
中def create_puzzle(行,列):
c = []
r = []
for x in range(cols):
c.append(False) #Statement1
for y in range(rows):
r.append(c) #Statement2
return LightsOutPuzzle(r)
Statement1:将元素追加到列表#[False,False,False] 假设id(c)为0x1000
Statement2:此语句会将相同列表(c)追加到rowList 结果(参考ID):[0x1000、0x1000、0x1000]
所以您的行将引用相同的List,这就是当您在List列之一中进行更改的原因,它也会反映在所有其他Lists列中。
更改您的create_puzzle
def create_puzzle(行,列):
myBoard = [[False]*cols for i in range(rows)]
return LightsOutPuzzle(myBoard )
答案 1 :(得分:0)
您可以在 init 方法内部进行操作,然后更改perform_move方法, 试试这个
class LightsOutPuzzle(object):
def __init__(self, board):
self.board = board
board = [not i for i in board]
print(board)
def get_board(self):
return self.board
def perform_move(self, row, col):
self.board[row][col] = not self.board[row][col]
print(self.board)
return LightsOutPuzzle(self.board)
def main():
LightsOutPuzzle([False, False, False])
if __name__ == '__main__':
main()