2012-07-18 21 views
3

如果我有以下矩陣A:哪個返回矩陣A中不同行數的最快方法?

A = {1,2,3} 
    {7,9,1} 
    {5,3,2} 

我怎麼能輕鬆地返回在矩陣不同的行數?在這種情況下,輸出必須是:「3」

我試圖使一個函數「‘:

void rows (int a[N][N], int row[N], int x){ 

    for (int i=0;i<N;i++){ 

     row[i]=a[x][i]; 


    } 

} 

然後,用功能’檢查」我試圖檢查行是不同的:

int check (int a[N][N]) 
{ 

    int row1[N]; 
    int row2[N]; 

    int j=0; 

    rows(a,row1,j); 
    rows(a,row2,j+1); 


    int count = 0; 


    for (int i=0; i<N; i++){ 
     for (int j=0; j<N; j++){ 


      if (row1[i] != row2[j]){ 

       count++; 

      } 

     } 
    } 


    return count; 

} 

但返回錯誤的數字,有什麼建議嗎?

+0

返回的數字大於3?可以說9? – 2012-07-18 10:29:01

回答

6

你的算法是完全錯誤的。增加break它在所有行不同時「工作」,但當某些行相同時它會中斷。它計算行數,使得存在與其不同的另一行。例如,如果你在

1 2 3 
4 5 6 
1 2 3 

運行它,你會得到一個答案3,但你應該得到一個2

的算法應該是這樣的:

  • 假設所有行是不同的(result = N
  • 對於每一行i,看看下面這行
  • 如果任何行下面j的行i等於row[i],遞減result並跳出內部循環
  • 在外部循環結束時,result含有找出你的答案。
+0

是的,這是正確的方法,我以爲只有第一個例子才能工作,謝謝! – 2012-07-18 10:41:27

1

嘗試不平等變量添加到:

int count = 0; 


for (int i=0; i<N; i++){ 
inequalty=0; 
    for (int j=0; j<N; j++){ 


     if (row1[i] != row2[j]){ 

      inequality=1; 
      break; //this makes even faster 

     } 

    } 
if(inequality!=0)count++; 
} 

即使單個元素的不平等,使該行不相等嗎?

+0

它的工作原理!非常感謝:D – 2012-07-18 10:31:05

+0

我沒有問題,謝謝。雙贏戰略 – 2012-07-18 10:31:42

+0

@ osiris_0100但這仍然只看前兩行。你嘗試過其他的例子嗎? – Henrik 2012-07-18 10:35:38

1

實現'CompareRows'函數作爲集合的謂詞。那麼,你所要做的只是 -

typedef vector<int> Rows; 
set<Rows, CompareRows> UniqRows; 

for (int i = 0 ; i < N ; ++i) 
    UniqRows.insert(Rows(a[i], a[i] + N)); 

UniqRows.size();