Форум сайта python.su
Всем доброй ночи.
Возникла такая проблемка: есть некий список (дерево) классов. В классах основным атрибутом является матрица 8*8, отвечающая за расстановку фигур на шахматной доске. Нужно расставить фигуры так, чтобы они не угрожали друг другу. Решаю пока что самым примитивным перебором всех вариантов.
class Board:
def __init__(self, board = None):
if not board:
self.board = [[0 for i in range(8)] for j in range(8)]
else:
self.board = copy.copy(board)
class PossibleBoard(Board):
def __init__(self, level, free_cells, parent, brd=None):
Board.__init__(self, board = brd)
self.level = level
self.free_cells = free_cells
self.parent = parent
class Work:
def __init__(self, figures):
self.figures = figures
self.board = PossibleBoard(0, 64, None)
self.result = [list() for i in range(len(self.figures)+1)]
self.result[0].append(self.board)
...
def set_queen(self, brd):
for x in range(8):
for y in range(8):
if not (brd.board)[x][y]:
tmp_board = PossibleBoard(self.level,
brd.free_cells-1,
copy.copy(brd),
copy.copy(brd.board))
(tmp_board.board)[x][y] = 'Q'
for i in range(8):
for j in range(8):
if (i==x or j==y or (abs(x-i)==abs(y-j)) ) and tmp_board.board[i][j]==0:
tmp_board.board[i][j] = 1
tmp_board.free_cells-=1
self.result[self.level].append(tmp_board)
Офлайн
Для вложенных списков необходимо использовать deepcopy
>>> import copy
>>> a = [[],[],[]]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> print id(a), [id(a[i]) for i in xrange(3)]
3073918252 [3073918124L, 3073918092L, 3073918284L]
>>> print id(b), [id(b[i]) for i in xrange(3)]
3073931276 [3073918124L, 3073918092L, 3073918284L]
>>> print id(c), [id(c[i]) for i in xrange(3)]
3073931180 [3073919372L, 3073931244L, 3073931340L]
Офлайн
Спасибо, помогло.
Офлайн
Подскажите почему не работает deepcopy
import copy
rows=2 # число строк в исходной матрице (будет потом расчетное)
columns=3 # число столбцов в исходной матрице (будет потом расчетное)
z=None
matr_rev = [[z]*rows]*columns # готовим матрицу из элементов None
print(matr_rev)
matr_rev2= copy.deepcopy(matr_rev) #глубокая копия
matr_rev2[0][1]=2 #вставка 1 элемента
print(matr_rev2)
Отредактировано (Дек. 16, 2011 11:36:29)
Офлайн
pyhappyона работает, просто первый список неправильно создаётся
Подскажите почему не работает deepcopy
Офлайн
py.user.nextа подскажите как правильно создать пустую матрицу переменных размеров (те размеры являются вычисляемыми значениями)pyhappyона работает, просто первый список неправильно создаётся
Подскажите почему не работает deepcopy
Офлайн
>>> rows, cols = 2, 3
>>> matr = [[None for j in range(cols)] for i in range(rows)]
>>> matr[0]
[None, None, None]
>>> matr
[[None, None, None], [None, None, None]]
>>>
Офлайн
py.user.nextТо что нужно. Спасибо!!>>> rows, cols = 2, 3
>>> matr = [[None for j in range(cols)] for i in range(rows)]
>>> matr[0]
[None, None, None]
>>> matr
[[None, None, None], [None, None, None]]
>>>
Офлайн
rows, cols = 2, 3
a = map(list,[*cols]*rows)
Офлайн
>>> x, y, z = 2, 3, 4
>>> matr = [[[None for k in range(z)] for j in range(y)] for i in range(x)]
>>> matr[0][0][0] = 1
>>> matr
[[[1, None, None, None], [None, None, None, None], [None, None, None, None]], [[None, None, None, None], [None, None, None, None], [None, None, None, None]]]
>>>
Офлайн