首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用一个C++向左移动矩阵的所有列

用一个C++向左移动矩阵的所有列
EN

Stack Overflow用户
提问于 2022-02-15 20:38:34
回答 3查看 245关注 0票数 0

我的问题是取一个矩阵mat of rowcol长度,并将其中的每一列向左移动一个位置。例如,如果我有这样一个3x3矩阵:

代码语言:javascript
复制
4 5 2
6 7 3 
3 4 6

结果必须是这样:

代码语言:javascript
复制
5 2 4
7 3 6
4 6 3

我不能让这个方法起作用,我做了多少次了,有人有什么想法吗?

下面是我的代码:

代码语言:javascript
复制
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]);
            }
EN

回答 3

Stack Overflow用户

发布于 2022-02-15 21:37:21

,这是我更新的解决方案,,比我几分钟前发布的那个更简单。

基本上,对于每一行:

  • 保存第一列中的值
  • 将行中的所有值(从第1列开始)向左移动。
  • 行中的最后一个值是前面从第一步保存的变量。

代码:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2022-02-15 20:53:08

下面的情况如何?

代码语言:javascript
复制
  for ( auto ui = 0u ; ui < rowcol ; ++ui )
    for ( auto uj = 1u ; uj < rowcol ; ++uj )
      std::swap(mat[ui][uj-1], mat[ui][uj]);

下面是一个完整的编译示例

代码语言:javascript
复制
#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);
}
票数 0
EN

Stack Overflow用户

发布于 2022-02-15 21:00:29

您的逻辑是正确的,除了,您实际上是移动矩阵的列一个位置向右,而不是左。不仅如此,(i==0)条件也不是必需的。

用前向迭代替换向后迭代,去掉条件语句,这样就可以了。以下是修改后的代码:

代码语言:javascript
复制
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]);
        }

基本上,您的逻辑与气泡分类类似。向右移动所有其他列,使最后一列向矩阵开始时冒泡。

我把它倒过来,这样我们就把第一栏变成了最后一栏。随时可以问任何问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71133093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档