c++ - 如何交换二维数组的最大和最小成员索引

标签 c++ c arrays dev-c++

所以这应该找到 2D 数组中的最大值和最小值并交换它们的位置,如果对应的是 2x2 数组的 1234,那么它应该是 4231。 这是我所做的:

    void interchange (int a[][n],int m) {
      int i,j;
      int cmin,cmax,rmin,rmax,temp;

      int max=a[0][0],min=a[0][0];

      for(i = 0; i < m; i++) {
         for(j = 0; j < n; j++) {
           if (a[i][j]<min) {
             rmin=i;
             cmin=j;
             min=a[i][j];
           } else if (a[i][j]>max) { 
             rmax=i;
             cmax=j;
             max=a[i][j];
           }

           temp=a[cmin][rmin];
           a[cmin][rmin]=a[cmax][rmax];
           a[cmax][rmax]=temp;
         }
     }
  }

我使用另一个函数来打印旧的和新的数组,但它总是打印旧的数组,当我尝试在交换函数中打印以查看发生了什么时,它输出一个零。

if..if else语句部分,我认为这样会更有效:

  if (a[i][j]<min) {
    rmin = i;
    cmin = j;
    min = a[rmin][cmin];
  }

...但仍然有同样的问题。这是整个代码:

#include<iostream.h>

const int n = 2;
const int m = 2;

void read(int a [][n], int m);
void write(int a [][n], int m);
void interchange(int a [][n], int m);

main(){
    int a[n][m];
    read(a, m);
    write(a, m);
    interchange(a, m);
    write(a, m);
    return 0;
}

void read(int a [][n], int m){
    int i, j;
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            cin >> a[i][j];
}

void write(int a [][n], int m){
    int i, j;
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++)
            cout << a[i][j] << "\t";
        cout << endl;
    }
}

void interchange(int a [][n], int m){
    int i, j;
    int cmin, cmax, rmin, rmax, temp;

    int max = a[0][0], min = a[0][0];

    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++)
            if (a[i][j] < min){
                rmin = i;
                cmin = j;
                min = a[rmin][cmin];
            }
            else if (a[i][j] > max){
                rmax = i;
                cmax = j;
                max = a[rmax][cmax];
            }
            temp = a[cmin][rmin];
            a[cmin][rmin] = a[cmax][rmax];
            a[cmax][rmax] = temp;
    }
}

最佳答案

您的代码中几乎没有问题。

  1. 循环整个数组,然后交换成员。因此,将交换代码放在两个循环之后
  2. 第一个元素本身可能是最小值或最大值。因此 rmin/cmin 或 rmax/cmax 可能永远不会被设置。因此将它们初始化为 0
  3. 使用适当的索引..不要混合列索引和行索引

    void interchange (int a[][n],int m) {
        int i,j;
        int cmin=0,cmax=0,rmin=0,rmax=0,temp;
        int max=a[0][0],min=a[0][0];
        for(i = 0; i < m; i++) {
           for(j = 0; j < n; j++) {
               if (a[i][j]<min) {
                   rmin=i;
                   cmin=j;
                   min=a[i][j];
               }
               if (a[i][j]>max) {
                   rmax=i;
                   cmax=j;
                   max=a[i][j];
               }
            }
        }
    
        temp=a[rmin][cmin];
        a[rmin][cmin]=a[rmax][cmax];
        a[rmax][cmax]=temp;
    }
    

关于c++ - 如何交换二维数组的最大和最小成员索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319915/

相关文章:

c++ - QObject::connect: QT 上没有这样的插槽

c++ - 生成随机 boolean 值

c - 指针之间的数据

arrays - 在 VBA 中隐藏连续值

c++ - Visual Studio 2015 中的 "non-standard syntax; use ' 和 ' to create a pointer to member"错误

c++ - 透视投影与光线追踪/光线转换的效率

python - 在python中导入C dll函数

c - 无法使用 ta-lib 编译源代码

java - 从 String.split 创建数组时出现 NullPointerException

javascript - React.js - 在点击事件中查找映射元素的 ID