如何顺时针交换二次矩阵的四分之一(从左上角开始)

How to swap the quarters of quadratic matrix clockwise (beginning from top left corner)?

本文关键字:四分之一 开始 左上角 二次 交换 顺时针      更新时间:2023-10-16

我想写一个程序:

  1. 生成大小为 (2Nx2N) 的二次矩阵
  2. 打印此矩阵
  3. 顺时针交换矩阵的四分之一(从顶部开始左下角)
  4. 打印更改的矩阵

例如,我的程序的输出应该是这样的:

01 02 03 04 
05 06 07 08 
09 10 11 12
13 14 15 16
Matrix (changed)
09 10 01 02
13 14 05 06
11 12 03 03 
15 16 07 08

这是我的源代码:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
using namespace std;
const int n = 4; // size of matrix
void CreateMatrix(int matrix[][n], int n); // functions' prototypes
void PrintMatrix(int matrix[][n], int n);
void ProcessMatrix(int matrix[][n], int n);
int main()
{
    int matrix[n][n];
    srand(time(NULL));
    CreateMatrix(matrix, n);    //create matrix
    PrintMatrix(matrix, n);     //print matrix
    ProcessMatrix(matrix, n);   //change matrix
    cout<<"nMatrix(changed):n"; 
    PrintMatrix(matrix, n);    // print changed matrix
}
void CreateMatrix(int matrix[][n],int n)
{
    for (int i =0; i<n; i++)
        for(int j = 0; j<n; j++)
            matrix[i][j] = rand()%10;
}
void PrintMatrix(int matrix[][n], int n)
{
    for(int i=0; i<n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout<<matrix[i][j]<<" ";
        }
        cout<<"n";
    }
}
void ProcessMatrix(int matrix[][n], int n) 
{
    // I don't know how to write this function
}

所以我的问题是如何编写ProcessMatrix函数?任何帮助不胜感激!顺便说一下,这是我的尝试:

void ProcessMatrix(int matrix[][n], int n) 
{
    for (int i = 0; i<n/2; i++) 
    {
        for(int j=0; j<n/2; j++)
        {
            matrix[i][j] = matrix[i+n/4][j+n/4];        // something wrong here
        }
    }
}

在 (0..N-1, 0..N-1, 0..N-1) 中旋转 m[i][j]、m[N+i][j] 表示 (i,j)。

请注意,以下内容是N矩阵大小的一半,用于问题的描述,但不用于代码。这里的矩阵是m[2 * N][2 * N] .

这个想法是,你迭代矩阵的四分之一以上,然后在所有 4 个季度的相应位置对 4 个元素进行周期换。元素需要按此处所示的循环移动:

m[i    ][k] ----> m[i    ][N + k]
     A                  |
     |                  |
     |                  |
     |                  V
m[N + i][k] <---- m[N + i][N + k]

对于此周期换,您只需要一个临时变量。代码的核心部分如下所示:

for (int i = 0; i < N; ++i) {
    for (int k = 0; k < N; ++k) {
        int t = m[i][k];
        m[i][k] = m[N + i][k];
        m[N + i][k] = m[N + i][N + k];
        m[N + i][N + k] = m[i][N + k];
        m[i][N + k] = t;
    }
}

这里有些不对劲

错误的是,在处理矩阵的某些部分之前,您就开始覆盖它们。

您需要可以使用的矩阵副本,而无需修改原始矩阵。完成后,您可以更新原始文件。

void ProcessMatrix(int matrix[][n], int n) {
    int newmatrix[n][n];
    // build new one
    for (int i = 0; i<n/2; i++) {
        for (int j=0; j<n/2; j++) {
            newmatrix[i][j] = matrix[i][j+n/2];
            newmatrix[i][j+n/2] = matrix[i+n/2][j+n/2];
            newmatrix[i+n/2][j+n/2] = matrix[i+n/2][j];
            newmatrix[i+n/2][j] = matrix[i][j];
        }
    }
    // copy it to old
    for (int i = 0; i<n; i++) {
        for(int j=0; j<n; j++) {
            matrix[i][j] = newmatrix[i][j];
        }
    }
}