所以这应该找到 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;
}
}
最佳答案
您的代码中几乎没有问题。
- 循环整个数组,然后交换成员。因此,将交换代码放在两个循环之后
- 第一个元素本身可能是最小值或最大值。因此 rmin/cmin 或 rmax/cmax 可能永远不会被设置。因此将它们初始化为 0
使用适当的索引..不要混合列索引和行索引
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/