顺时针旋转二维数组

Posted

技术标签:

【中文标题】顺时针旋转二维数组【英文标题】:Rotating 2d array clockwise 【发布时间】:2019-02-20 06:22:56 【问题描述】:

我需要创建广告 2d 动态数组,然后创建一个函数,该函数将接收 2d 动态数组,然后将其顺时针旋转 90 度并将其返回给 main。 但是我不确定为什么我没有得到任何输出?是因为错误的交换技术吗? 我认为索引交换如下:

I J-----------I J
0 0           0 1
0 1           1 1
0 2           2 1

我带来了:

for (int i = 0; i <row;i++)

    for(int j = 0;j<col; j++)
    
        Roti[i+j][row-i]=arr[i][j];

    

代码:

#include <iostream>
using namespace std;
void print2DArray(int **arr, int rows, int cols);
int **Rotate(int **arr, int row, int col)

    int **Roti = new int *[row];

    for (int i = 0; i <row;i++)
    
        Roti[i] = new int [col];
    


    for (int i = 0; i <row;i++)

        for(int j = 0;j<col; j++)
        
            Roti[i+j][row-i]=arr[i][j];

        
    return  Roti;


int main()

    int *A[3];
    for (int i = 0; i < 3; i++)
    
        A[i] = new int[3];
        for (int j = 0; j < 3; j++)
        
            A[i][j] = rand() % 20;
        
    
    cout << "The array is :\n";
    print2DArray(A, 3, 3);
    int **ptr;
    ptr=Rotate(A,3,3);
cout<<"-----"<<endl;
    print2DArray(ptr, 3, 3);




    for (int i = 0; i < 3; i++)
    
        delete[] A[i];
    
    return 0;

void print2DArray(int **arr, int rows, int cols)

    for (int i = 0; i < rows; i++)
    
        for (int j = 0; j < cols; j++)
        
            cout << arr[i][j] << " ";
        
        cout << endl;
    


【问题讨论】:

你试过先在纸上解决吗?如果不先这样做。我也推荐你learn how to debug your programs。在调试器中运行你的程序,看看它是否崩溃。如果是这样,那么调试器将在崩溃的位置停止,让您知道它发生的时间和地点,并让您检查变量以确保它们正常。如果没有崩溃,则逐行逐行检查代码,以确保您的纸上解决方案正确实施并执行您认为应该执行的操作。 顺便说一句,你有内存泄漏。另外请花一些时间阅读how to ask good questions 和this question checklist。然后尝试改进您的问题,例如通过告诉我们预期输出与实际输出,或者如果您遇到崩溃,请向我们提供有关该问题的详细信息。 【参考方案1】:

希望您所说的“旋转”不是指常规转置,因为在 *** 上已经有很多答案。 What is the fastest way to transpose a matrix in C++?

对于矩阵的旋转,我修改了您的代码,使其工作如下所示。逻辑很简单,原始矩阵的第一行成为旋转矩阵的最后一列,使用此逻辑,您可以得出以下代码。希望能帮助到你。

#include <iostream>
using namespace std;

void print2DArray(int **arr, int rows, int cols);
int **Rotate(int **arr, int num_rows, int num_cols);

int main()

    int num_rows = 3;
    int num_cols = 3;
    int** A_matrix = new int*[num_rows];
    for (int i = 0; i < num_rows; i++)
        A_matrix[i] = new int[num_cols];

    for (int row = 0; row < num_rows; row++)
    
        for (int col = 0; col < num_cols; col++)
        
            A_matrix[row][col] = rand() % 20;
        
    

    cout << "The array is :\n";
    print2DArray(A_matrix, 3, 3);

    int** roated_matrix;
    roated_matrix = Rotate(A_matrix, num_rows, num_cols);
    cout << "Rotated array:" << endl;
    print2DArray(roated_matrix, 3, 3);


    return 0;


int **Rotate(int **arr, int num_rows, int num_cols)

    /* Rotated matrix will have dimensions reverse as well. 
       That's why we have rows and cols reversed in the following lines */
    int** rotated_matrix = new int*[num_cols];
    for (int i = 0; i < num_cols; i++)
        rotated_matrix[i] = new int[num_rows];


    for (int row = 0; row < num_rows; row++)
    
        int col_rotated_matrix = num_rows - 1 - row; // 1st row shall be copied to the last column and so on
        for (int col = 0; col < num_cols; col++)
        
            int row_rotated_matrix = col; // rows become columns in the rotated matrix
            rotated_matrix[row_rotated_matrix][col_rotated_matrix] = arr[row][col];
        
    
    return rotated_matrix;

void print2DArray(int **arr, int rows, int cols)

    for (int i = 0; i < rows; i++)
    
        for (int j = 0; j < cols; j++)
        
            cout << arr[i][j] << " ";
        
        cout << endl;
    

它产生以下输出:

The array is :
1 7 14
0 9 4
18 18 2
Rotated array:
18 0 1
18 9 7
2 4 14

【讨论】:

是否可以修改它以旋转任意大小的数组? 您可以使用此代码来旋转任意大小的数组。但是,请修改对print2DArray 函数的调用。对普通数组使用print2DArray(A_matrix, num_rows, num_cols);,对旋转数组使用print2DArray(roated_matrix, num_cols, num_rows);。请注意,旋转数组的尺寸是相反的。【参考方案2】:

尝试使用这个;

for (int i = 0; i <row;i++)
k = row.length -1 ;
    for(int j = 0;j<col; j++)
    
        Roti[j][k]=arr[i][j];

    

【讨论】:

以上是关于顺时针旋转二维数组的主要内容,如果未能解决你的问题,请参考以下文章

二维数组顺时针旋转90度

Python学习笔记 之 递归二维数组顺时针旋转90°正则表达式

顺时针旋转填充 2维数组

算法之二维数组旋转

二维数组6:数组的水平翻转

python 二维数组90°旋转