2017-05-30 20 views
0

例如,如果存在N = 4 1,我想填充3×3矩陣,每個置換在每個上下三角形中與2 1對稱。我會得到[010,101,010],[001,001,110]和[011,100,100]。如何用1和零遞歸地填充矩陣,使得對角線爲零,並且在其他元素中有N 1個?例如

+0

爲什麼你需要遞歸地做呢?遞歸地解決問題意味着您可以將問題分成相同但較小的問題,首先解決較小的問題,然後使用遞歸逐步實現更大的問題。但這似乎並不是這種情況,不能認爲有辦法這樣做。告訴我你是怎麼想到用遞歸來解決這個問題的,也許我可以幫你 –

+0

對不起,我想我並不是說要做遞歸,只是一種獲得0,1矩陣的所有置換的方式,只有一定的1的數量和沿着對角線的全部0。 –

回答

0

這是怎麼回事?

void matrixFill(int[,] m, int n) 
{ 
    m[n-1, n-1] = 0; 
    if (n > 1) 
    { 
     for (int i = 0; i < n-1; i++) 
     { 
      m[i, n-1] = 1; 
      m[n-1, i] = 1; 
     } 
     matrixFill(m , n-1); 
    } 
} 

遞歸的每個級別設置一個對角線元素並且其餘的行/列在該元素中相交。


沒有明確的迭代第2次嘗試:

// 1st call matrixFill2(m , n-1, n-1) 
void matrixFill2(int[,] m, int x, int y) 
{ 
    if ((x >= 0) && (y >= 0)) 
    { 
     m[x, y] = (x == y) ? 0 : 1; 
     matrixFill2(m, x-1, y); 
     matrixFill2(m, x, y-1); 
     matrixFill2(m, x-1, y-1); 
    } 
} 

這個版本將設置母細胞不止一次。行/列索引保持不變或減少。因此,遞歸最終會終止。

0
#Figured it out 
from __future__ import print_function 
import itertools 
import numpy as np 

N = 4 
S = N*(N-1)/2 
E = 3 

which = np.array(list(itertools.combinations(range(S), E))) 
grid = np.zeros((len(which), S), dtype="int8") 
grid[np.arange(len(which))[None].T, which] = 1 

for perm in range(len(grid)): 
    grid_num = perm 
    A = np.zeros((N,N)) 
    counter = 0 
    for i in range(N): 
     for j in range(i): 
      A[i][j] = grid[grid_num][counter] 
      A[j][i] = grid[grid_num][counter] 
      counter = counter + 1 
    print() 
    print(A) 
相關問題