【问题标题】:Right rotation for 2D array二维数组的右旋转
【发布时间】:2021-01-13 11:29:44
【问题描述】:

我尝试为二维数组编写正确的旋转代码。

这里是主要代码:

for (int k = 0; k < rotate; k++) { //rotate is the no of times to shift right
   for (int i = 0; i < n1; i++) { //n1 is no: of rows
        for (int j = 0; j <n2; j++) { //n2 is no: of columns

            //Shifting right
            int temp = A[i][n2 - 1]; 
            A[i][n2 - 1] = A[i][j + 1];
            A[i][j + 1] = A[i][j];
            A[i][j] = temp;
        }  
    }     
}

for (int i = 0; i < n1; i++) {
    for (int j = 0; j < n2; j++) {
        printf("%d", A[i][j]);
    }
    printf("\n");
}

它适用于 2x2 尺寸,其中:

输入:

1 2
3 4

输出:

2 1
4 3

但它不适用于 3x3 及以上尺寸。

输入:

1 2 3                                                                                                                                        
4 5 6                                                                                                                                
7 8 9

输出:

3 2 1                                                                                                                                   
6 5 4                                                                                                                                    
9 8 7 

预期输出是:

3 1 2
6 4 5
9 7 8

请指导我哪里错了,对于我的问题中的任何错误,我深表歉意。

【问题讨论】:

  • 这行int temp=A[i][n2-1]; 应该放在j循环之前
  • 请注意,如果您提供最低限度的工作示例,我们将更容易测试程序并为您提供帮助

标签: arrays c rotation right-to-left shift


【解决方案1】:

见:

https://www.programiz.com/c-programming/examples/matrix-transpose ;)

您可以将该解决方案更改为使用一个数组。

【讨论】:

    【解决方案2】:

    在您的代码中,您指的是左右邻居(尽管左邻居被错误地引用,因为它应该是仅用于第一次迭代的最后一个单元格)并且不保留下一次迭代的值。

    应该是这样实现的:

    对于每一行,left 都使用该行中最后一项的值进行初始化,因为它位于第 0 项的左侧。然后在迭代行项时,我们首先将当前值保存到temp 以供以后使用,然后将left 保存到当前项,然后将先前保存的temp 用作新的left 进行下一次迭代。

    for (int k = 0; k < rotate; k++) { //rotate is the no of times to shift right
        for (int i = 0; i < n1; i++) { //n1 is no: of rows
            int left = A[i][n2 - 1]; 
            for (int j = 0; j < n2; j++) { //n2 is no: of columns
    
                //Shifting right
                int temp = A[i][j];
                A[i][j] = left;
                left = temp;
            }  
        }     
    }
    

    【讨论】:

    • 你能告诉我prev是什么吗?
    • 对不起,应该是left,我编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2019-03-06
    • 2021-11-02
    • 2022-01-07
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多