【问题标题】:Is this logical approach right for my program?这种合乎逻辑的方法适合我的程序吗?
【发布时间】:2017-11-08 09:14:03
【问题描述】:

程序 - 将矩阵顺时针旋转 90 度。 我是编码的初学者。我在 GeeksforGeeks 上遇到了这个问题。我发现解决方案非常复杂,因此尝试应用我的逻辑。但我不知道我的逻辑是否适合该程序。请指导我。

#include<stdio.h>
int main()
{
    int  A = 0 , a = 0 , b = 0;
    int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    printf("90 Degree rotation: \n");
    printf("\n");
    for(A = 2; A >= 0; A--)
    {
        for(a = 0; a < 3 ; a++)
        {
            for(b = 0; b < 3 ; b++)
            {
                if(b==A)
                    printf("%d\t",arr[a][b]);
            }
        }
        printf("\n");
    }
}

输入

1 2 3
4 5 6
7 8 9

输出

3 6 9
2 5 8
1 4 7

【问题讨论】:

  • 为什么不直接反转 a & b 循环并删除外循环?你有 1 个循环太多。或者直接打印arr[b][a]。好吧,也许你必须反转一些索引,但不应该超过 2 个循环来做到这一点。
  • 关于改进工作代码的问题属于CodeReview
  • 逆时针方向。

标签: c logic


【解决方案1】:

这是你的矩阵,你选择的轴:

  b ->
a 1 2 3
| 4 5 6
V 7 8 9

也就是说,例如,对于固定的a,如果增加b,则会打印“下一个数字”(前提是b 不是2)。同样,如果您将a 与相同的b 一起增加,则您将使用相同的列,但下一行。

因此,您可以使用以下伪程序来打印一整列(在一行上):

print_column(b):
  for a from 0 to 2
    print arr[a][b]
  print newline

你想要什么?您要打印以下内容:

3 6 9
2 5 8
1 4 7

即打印最后一列,然后是中间一列,然后是第一列,这是由以下伪程序完成的:

print the 3rd column of arr
print the 2nd column of arr
print the 1st column of arr

或者,更简洁:

for b from 2 to 0
  print the b-th column of arr.

所以,最终的伪代码是(内联 print_column 过程):

for b from 2 to 0
  for a from 0 to 2
    print arr[a][b]
  print newline

或者,在 C 中:

for(b = 2; b >= 0 ; b--)
{
    for(a = 0; a < 3 ; a++)
    {
            printf("%d\t",arr[a][b]);
    }
    printf("\n");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多