我在尝试按列更改行时遇到了一些麻烦。
我想要的只是更改静态2D数组(3x3)的行和列。我不想只是用反向索引打印数组。我试图在 int aux 中存储数组中实际位置的值,但没有效果。
输入:
1 2 3
4 5 6
7 8 9
输出:
1 4 7
2 5 8
3 6 9
使用此代码,结果是相同的2D数组。我看不出问题,你能帮助我吗?
#include <iostream>
using namespace std;
int main ()
{
int vec[3][3];
int x, y, aux;
//Input
for(x=0; x<3;x++)
{
for(y=0; y<3;y++)
{
cout << "POSITION ["<<x+1<<"]["<<y+1<<"]: ";
cin >> vec[x][y];
}
}
cout<<"\nPress ENTER...";
cin.ignore();
cin.get();
system("CLS");
//Array before the change
cout<<"ARRAY A"<<endl;
for(x=0; x<3;x++)
{
for(y=0; y<3;y++)
{
cout<<vec[x][y]<<"\t";
}
cout << "\n";
}
//Change
for(x=0; x<3;x++)
{
for(y=0; y<3;y++)
{
if(x!=y)
{
aux=vec[x][y];
vec[x][y]=vec[y][x];
vec[y][x]=aux;
}
}
}
//Array after the change
cout<<"\nARRAY A"<<endl;
for(x=0; x<3;x++)
{
for(y=0; y<3;y++)
{
cout<<vec[x][y]<<"\t";
}
cout << "\n";
}
cout << "\n";
system("PAUSE");
return 0;
}
答案 0 :(得分:4)
您正在交换元素两次。因此他们回到原来的位置。
更改
if(x!=y)
到
if(x < y)
因此只有当元素说(2,3)时才交换。如果它是(3,2),那么它已经被交换了,我们不应该再次交换它。
答案 1 :(得分:1)
你真正需要做的就是交换。在3x3矩阵的情况下,它只是交换左下角和右上角的元素:
const int SIZE = 3;
for (int i = 0; i < SIZE; ++i)
{
for (int j = 0; j < SIZE; ++j)
{
if (i < j)
{
swap(vec[i][j], vec[j][i]);
}
}
}
请注意,我们停止j
迭代整个向量。这是因为如果我们迭代整个向量,它会将它们交换回原来的位置。
答案 2 :(得分:1)
如下所示,您可以切换两次。要迭代最少的次数,最明智的改变就是改变你的第二个循环:
for (y = 0; y < 3; y++)
到
for (y = 0; y < x; y++)
答案 3 :(得分:0)
int N = M-1; // M is end bound for MxM matrix, only work for Mxm matrix.
int index1 = 1;
for (index0 = 0; index0 < N; index0++) // loop through row
{
for(index1; index1 < M; index1++) //swapping about the diagn line.
{
tempN = minorMatrix[index0][index1];
minorMatrix[index0][index1] = minorMatrix[index1][index0];
minorMatrix[index1][index0] = tempN;
}
index1++; // number of swapping reduce by one after each row.
}
答案 4 :(得分:0)
您要交换两次伴侣!
只需交换x < y
或x > y
,但不能两者都交换。