用n个元素填充n * n矩阵

时间:2013-08-03 23:18:33

标签: python

我想用n个元素填充nxn矩阵,这样每行和每列只有1个元素。例如。一个3x3矩阵可以有以下可能的解决方案:

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

但是所有的元素都是标准的。有人可以指出我的错误。

3 个答案:

答案 0 :(得分:8)

  

n * n矩阵,包含n个元素,这样每行和每列只有1个元素。

我假设您想要一个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

答案 1 :(得分: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

答案 2 :(得分: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