2013-08-03 5 views
3

Я хочу заполнить nxn-матрицу n элементами, так что каждая строка и каждый столбец имеют ровно 1 элемент. Например. матрица 3x3 может иметь следующие возможные решения:Заполнение n * n матрицы с n элементами

1 0 0  0 1 0  0 0 1 
0 1 0  1 0 0  1 0 0 
0 0 1  0 0 1  0 1 0 

Ниже приводится код, который я написал:

arr=[[0 for x in xrange(n)] for x in xrange(n)] 
i=0 
while i<n: 
    j=0 
    while j<n: 
     arr[i][j]=0 
     j+=1 
    i+=1 

i=0 
while i<n: 
    j=0 
    while j<n: 
     x=0 
     while x<n: 
      if((arr[i][x-1]==1) or (arr[x-1][j]==1)): 
       break 
      x+=1 
     if(x==n-1 and arr[i][n-1]==0 and arr[n-1][j]==0): 
      arr[i][j]=1 
     j+=1 
    i+=1 

Но все элементы Stiil 0. Может кто-то пожалуйста, указать на мою ошибку.

+0

Пожалуйста, дайте образец матрицы вы хотите. – zhangyangyu

+0

@zhangyangyu: я обновил вопрос примерами – nish

+0

Вам нужно вычислить несколько возможных решений или достаточную диагональную матрицу? –

ответ

3

статьи применима ваш код :

arr=[[0 for x in xrange(n)] for x in xrange(n)] 

Следующая петля является излишней, поскольку матрица уже инициализирована в 0:

i=0 
while i<n: 
    j=0 
    while j<n: 
     arr[i][j]=0 
     j+=1 
    i+=1 

Некоторые изменения рядного сейчас:

i=0 
while i<n: 
    j=0 
    while j<n: 
     ok = True 
     x=0 
     while x<n: 
      # Why 'x-1' here? 
      if((arr[i][x]==1) or (arr[x][j]==1)): 
       ok = False 
       break 
      x+=1 
     if ok: 
      arr[i][j]=1 
     j+=1 
    i+=1 
+0

Спасибо большое! :) – nish

8

n * n матрица с n элементами, так что каждая строка и каждый столбец имеют ровно один элемент.

Я предполагаю, что вы хотите п * п матрица имеет ровно один нон 0 элемент на каждой строке/колонке


Вы ищете способ построить диагональную матрицу?

>>> n = 5 
>>> [[1 if j == i else 0 for j in range(n)] for i in range(n)] 
[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]] 

Если вам нужно все возможные перестановки, вы могли бы написать:

>>> n = 5 
>>> m = [[1 if j == i else 0 for j in range(n)] for i in range(n)] 
>>> from itertools import permutations 
>>> for p in permutations(m): 
>>>  print p 
+0

Диагональная матрица будет только одним возможным решением, я обновил свой вопрос примерами – nish

+0

@nish Вся матрица, соответствующая вашему описанию, является перестановкой идентификационной матрицы. Итак, я обновил свой ответ, чтобы показать вам, как использовать [itertools.permutations] (http://docs.python.org/2/library/itertools.html#itertools.permutations) для генерации всех возможных перестановок этой матрицы , –

+0

Довольно элегантное решение. Спасибо за ответ.Но я хочу выяснить, что не так с моей логикой – nish

2

Вы можете создать все матриц, таким образом:

for per in itertools.permutations(range(n)): 
    matrix = [[0 for x in xrange(n)] for x in xrange(n)] 
    for i, j in enumerate(per): 
    matrix[i][j] = 1 
    print matrix 
Смежные вопросы