2017-03-06 69 views
0

我試圖用反向對角線交換最小行值。我設法打印出每行最小值,但我的交換失敗。也許你可以給我一些提示。用反向對角線交換2d陣列最小行值

for (int i = 0; i < n; i++) 
    { 
     int min = mas[i][0]; 
     for (int j = 1; j < m; j++) 
     { 
      if (mas[i][j] < min) 
      { 
       min = mas[i][j]; 
      } 
      for(int k=n-1;k>0;k--){ 
       for(int h = m-1; h>0;h--){ 

       min = mas[i][j]; 
       mas[i][j]=mas[k][h]; 
       mas[k][h]=min; 
      } 
      cout << "New Matrix\n"; 
      for(int i = 0; i < n; i++) { 
      for(int j = 0; j < m; j++) { 
      cout << mas[i][j] << " "; 
     } 
      } 
     } 
    }   
    system("pause"); 
    return EXIT_SUCCESS; 
} 

這是我for爲最小值,後來我加入另一個for交換價值。

我的結果: 我打印出3個矩陣,它們都沒有正確交換值。我猜這是因爲週期?

我的文件與二維數組:

1 2 5 // row min 1, reverse diagonal 5 
2 8 9 // row min 2, reverse diagonal 8 
5 9 10 // row min 5, revese diagonal 5 

我期待什麼輸出:

5 2 1 // 5 diagonal swap with min = 1 
8 2 9 // 8 diagonal swap with min = 2 
5 9 10 // 5 diagonal no swap because 5 is row minimum 
+1

你能告訴你的輸入數據的一個例子,它應該如何看你處理後呢? – NathanOliver

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

@NathanOliver我已添加更多代碼。 – NotsoPr0

回答

0

如果我理解正確的話,則「反向對角線」只能在一個方陣存在。因此,輸入兩個值nm來處理方陣是沒有意義的。

如果要考慮在您的問題中顯示的3 x 3矩陣的示例,並使用循環代替標準函數std::max_elementstd::swap,則轉換矩陣的代碼可以按照以下方式進行查找,如示範項目

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    const size_t N = 3; 
    int a[N][N] = 
    { 
     { 1, 2, 5 }, 
     { 2, 8, 9 }, 
     { 5, 9, 10 } 
    }; 

    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) 
     { 
      std::cout << std::setw(2) << a[i][j] << ' '; 
     } 
     std::cout << '\n'; 
    } 

    std::cout << std::endl; 

    for (size_t i = 0; i < N; i++) 
    { 
     size_t min = 0; 
     for (size_t j = 1; j < N; j++) 
     { 
      if (a[i][j] < a[i][min]) min = j; 
     } 

     if (min != N - i - 1) 
     { 
      int tmp = a[i][min]; 
      a[i][min] = a[i][N - i - 1]; 
      a[i][N - i - 1] = tmp; 
     } 
    } 

    for (size_t i = 0; i < N; i++) 
    { 
     for (size_t j = 0; j < N; j++) 
     { 
      std::cout << std::setw(2) << a[i][j] << ' '; 
     } 
     std::cout << '\n'; 
    } 

    std::cout << std::endl; 
} 

程序輸出是

1 2 5 
2 8 9 
5 9 10 

5 2 1 
8 2 9 
5 9 10 
+0

謝謝你的這個例子。這正是我想要得到的。 – NotsoPr0