重新排列数组的行和列时出现问题

Problem in rearranging rows and columns of an array

本文关键字:问题 新排列 排列 数组      更新时间:2023-10-16

通常,给定任务:

允许的矩阵变换是两个相邻行或两个相邻列的排列。给出了n阶(n<=12(的实平方矩阵。使用有效的转换器,可以得到一个矩阵,其中最大元素位于左上角。元素用于执行有效的转换。

我的问题恰恰是我不能交换相邻的行或列。

这是我的代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int rows = 4, cols = rows;
int iMax = 0;
int jMax = 0;
int arr[rows][cols];
void arr_f()
{
setlocale(LC_ALL, "rus");

for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
cin >> arr[i][j];
}
}
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
cout << " " << arr[i][j] << "t";
if (arr[i][j] > arr[iMax][jMax])
{
iMax = i;
jMax = j;
}
}
cout << endl;
}
cout << endl << "The maximum number of array: " << arr[iMax][jMax] << endl << endl;
}

int main()
{
arr_f();
system("pause");
} 

尝试添加功能

inline void swap_columns(const int f, const int s)
{
for (int i = 0; i < rows; ++i)
{
swap(arr[i][f], arr[i][s]);
}
}
inline void swap_rows(const int f, const int s)
{
for (int i = 0; i < rows; ++i)
{
swap(arr[f][i], arr[s][i]);
}
}

并在arr_f((函数中添加以下内容:

swap_rows(0, iMax);
swap_columns(0, jMax);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
cout << " " << arr[i][j] << "t";
}
cout << endl;
}

但在这种情况下,行(和列(并没有如预期的那样改变(最大值所在的行立即被第一行替换,忽略其余行(。

您获得了错误的结果,因为swap_columnsswap_rows进行了不允许的操作。你需要这样做:

inline void swap_columns(const int k)
{
for (int i = 0; i < rows; ++i)
{
swap(arr[i][k], arr[i][k+1]);
}
}
inline void swap_rows(const int k)
{
for (int i = 0; i < rows; ++i)
{
swap(arr[k][i], arr[k+1][i]);
}
}

并以这种方式应用:

for (int k = iMax-1; k >= 0; --k)
swap_rows(k);
for (int k = jMax-1; k >= 0; --k)
swap_columns(k);

当然,这可以通过移动更大的块来改善,但这是一个优化问题。

要交换相邻的行和列,只需替换它:

swap_rows(0, iMax);
swap_columns(0, jMax);

这个:

swap_rows(iMax + 1, iMax);
swap_columns(jMax + 1, jMax);

然而,从问题描述中还不清楚这是否总是所需的解决方案。如果iMax恰好是最后一行索引,那么iMax+1将超出界限,并在运行时失败。在这种情况下,可能需要iMax-1。