如何顺时针交换二次矩阵的四分之一(从左上角开始)
How to swap the quarters of quadratic matrix clockwise (beginning from top left corner)?
我想写一个程序:
- 生成大小为 (2Nx2N) 的二次矩阵
- 打印此矩阵
- 顺时针交换矩阵的四分之一(从顶部开始左下角)
- 打印更改的矩阵
例如,我的程序的输出应该是这样的:
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];
}
}
}
相关文章:
- 自一周开始以来的秒数?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 为什么 std::cin 从一开始就不读
- SDL_Mixer再次播放时,从随机位置开始一段时间,然后从头开始
- Curl - 发送数百个请求,但一次只能发送四个 - 编程
- 如何从一段时间开始打开和关闭文件
- 从最后一开始就剩下的argv
- pi的倍数到千分之一的值可能会改变循环执行方式
- C 求解四分之一根(第四阶多项式)
- 编写代码将给定的数字转换为单词(例如1234作为输入应输出一千二百三十四)
- 要创建一个一开始没有特定维度的类Vector,请在类中创建一个方法,允许向向量添加维度
- 如何顺时针交换二次矩阵的四分之一(从左上角开始)
- 正在查找半浮动或四分之一浮动库
- GDB -如何从一开始就进入步进模式
- 有效地将向量的底部四分之一移动到顶部
- 如何在当前时间的打印输出中获得更高的精度(几分之一秒)
- 为什么我们需要把const放在函数头的末尾,而一开始是静态的
- 为什么代码一开始打印0
- C/CUDA:CudaArray 中只有四分之一的元素可以索引
- 制作《马里奥派对》游戏,但游戏一开始就会宣布谁是赢家