2017-03-06 38 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