我的问题是取一个矩阵mat of rowcol长度,并将其中的每一列向左移动一个位置。例如,如果我有这样一个3x3矩阵:
4 5 2
6 7 3
3 4 6结果必须是这样:
5 2 4
7 3 6
4 6 3我不能让这个方法起作用,我做了多少次了,有人有什么想法吗?
下面是我的代码:
for(int i = rowcol - 1; i > 0; i--)
for(int j = 0; j < rowcol; j++) {
if(i == 0) swap(mat[j][rowcol - 1], mat[j][i]);
swap(mat[j][i], mat[j][i-1]);
}发布于 2022-02-15 21:37:21
,这是我更新的解决方案,,比我几分钟前发布的那个更简单。
基本上,对于每一行:
代码:
for (size_t row = 0; row < rowcol; row++) {
int tmp = mat[row][0];
for (size_t col = 1; col < rowcol; col++) {
mat[row][col-1] = mat[row][col];
}
mat[row][rowcol-1] = tmp;
}发布于 2022-02-15 20:53:08
下面的情况如何?
for ( auto ui = 0u ; ui < rowcol ; ++ui )
for ( auto uj = 1u ; uj < rowcol ; ++uj )
std::swap(mat[ui][uj-1], mat[ui][uj]);下面是一个完整的编译示例
#include <iostream>
static constexpr std::size_t rowcol = 3u;
void printMat (int mat[rowcol][rowcol])
{
for ( auto ui = 0u ; ui < rowcol ; ++ui ) {
for ( auto uj = 0u ; uj < rowcol ; ++uj )
std::cout << mat[ui][uj] << ' ';
std::cout << std::endl;
}
std::cout << std::endl;
}
int main()
{
int mat[rowcol][rowcol] { {4, 5, 2}, {6, 7, 3}, {3, 4, 6} };
printMat(mat);
for ( auto ui = 0u ; ui < rowcol ; ++ui )
for ( auto uj = 1u ; uj < rowcol ; ++uj )
std::swap(mat[ui][uj-1], mat[ui][uj]);
printMat(mat);
}发布于 2022-02-15 21:00:29
您的逻辑是正确的,除了,您实际上是移动矩阵的列一个位置向右,而不是左。不仅如此,(i==0)条件也不是必需的。
用前向迭代替换向后迭代,去掉条件语句,这样就可以了。以下是修改后的代码:
for(int i = 0; i < rowcol-1; i++)
for(int j = 0; j < rowcol; j++) {
// if(i == 0) swap(mat[j][rowcol - 1], mat[j][i]);
swap(mat[j][i], mat[j][i+1]);
}基本上,您的逻辑与气泡分类类似。向右移动所有其他列,使最后一列向矩阵开始时冒泡。
我把它倒过来,这样我们就把第一栏变成了最后一栏。随时可以问任何问题。
https://stackoverflow.com/questions/71133093
复制相似问题