【问题标题】:swap rows matrix C++交换行矩阵 C++
【发布时间】:2019-03-24 01:07:33
【问题描述】:

你好,我的程序有问题,我想用下一个结构交换矩阵中的行:

第一行和最后一行。

第二行和倒数第二行。

直到 N 到 N 个值。

注意:我使用了#define n 4,但我需要能够为任何 n 值做到这一点。

输入:

3 4 5 0
2 6 1 2
2 7 1 2
2 1 1 2

输出:

2 1 1 2
2 7 1 2
2 6 1 2
3 4 5 0

这个程序只改变第一行和最后一行:

#include <iostream>

using namespace std;

#define n 4 

void interchange(int m[][n])
{
    int rows = n;


    for (int i = 0; i < n; i++)
    {
        int t = m[0][i];
        m[0][i] = m[rows - 1][i];
        m[rows - 1][i] = t;
    }
}


int main()
{

    int m[n][n] = {
        { 8, 9, 7, 6 },
        { 4, 7, 6, 5 },
        { 3, 2, 1, 8 },
        { 9, 9, 7, 7 }
    };

    interchange(m);


    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << m[i][j] << " ";
        cout << endl;
    }
}

谢谢。

【问题讨论】:

  • 您可以简单地打印/使用从n 开始的矩阵行,而不是0,根本不需要任何交换。
  • 使交换函数再接受两个参数 - 它应该交换的行。那么这个程序将变得非常类似于反转一维数组

标签: c++ matrix rows


【解决方案1】:

您需要使用额外的循环来遍历从第一行到最后一行的行,如下所示:

void interchange(int m[][n]) 
{ 
    int lastRow = n - 1; 

    for (int j = 0; j <= lastRow / 2; j++ ) {
        for (int i = 0; i < n; i++) 
        { 
            int t = m[j][i]; 
            m[j][i] = m[lastRow - j][i]; 
            m[lastRow - j][i] = t; 
        }
    }
}

【讨论】:

  • m[rows - j] 在第一次迭代时它将是 m[4-0] 因此超出范围。因此 UB。
  • @kiranBiradar,已修复
  • lastRow / 2 又错了,它将是 3/2 因此你少循环一行。
  • @kiranBiradar,将条件更改为j &lt;= lastRow / 2。似乎工作
【解决方案2】:

您需要逐行循环,从 0n/2 (for (int i = 0; i &lt; n/2; ++i))。每行中的元素再循环一次 (for(int j = 0; j &lt; n; j++))

您必须将索引为 i 的行中的每个元素与索引为 n-i-1 的行中的每个元素交换。

#include <iostream>
#define n 4

void interchange(int m[][n]) 
{ 
    for (int i = 0; i < n/2; ++i) 
    {
        for(int j = 0; j < n; j++)
        {
            std::swap(m[i][j], m[n-i-1][j]);
        }
    }
} 

int main()
{
    int m[n][n] = { { 8, 9, 7, 6 }, 
            { 4, 7, 6, 5 }, 
            { 3, 2, 1, 8 }, 
            { 9, 9, 7, 7 } }; 


    interchange(m);

    for (int i = 0; i < n; ++i) 
    {
        for(int j = 0; j < n; j++)
        {
            std::cout << m[i][j] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2019-07-03
    • 2017-04-19
    相关资源
    最近更新 更多