【问题标题】:How to check if two arrays are mirror images of each other in C?如何检查两个数组是否在C中相互镜像?
【发布时间】:2023-03-11 04:43:01
【问题描述】:

我正在尝试了解如何使用 C 来检查两个二维数组是否彼此对称/镜像。

例如,如果

array1 = { { 2, 5, 10 }, { 2, 1, 9 } };
array2 = { { 10, 5, 2 }, { 9, 1, 2 } };

数组实际上是二维数组。

我应该如何处理这个问题?到目前为止,我尝试读取两个二维数组并使用 if/else 语句和 bool 来检查两个数组是否彼此相等。但我不确定如何检查它们是否是彼此的镜像矩阵。

2 5 10  |  10 5 2
2 1  9  |   9 1 2

编译器是89的。

【问题讨论】:

  • 并行遍历数组,一个按升序,另一个按逆序。并进行比较。容易。
  • 在一个数组中使用 i 作为索引,另一个使用 n-i-1 其中 n 是它们的长度
  • 对我来说这些看起来像一维数组。还建议使用更新的(您的)编译器。
  • 如果你的 U 需要使用 gcc,我强烈建议现在放弃 VS。
  • “到目前为止,我尝试读取两个二维数组并使用 if/else 语句和...”发布该代码。

标签: c arrays for-loop boolean


【解决方案1】:

您想以相同的方式读取两个矩阵的值(提示 1:使用函数)。所以它们看起来都是这样的:

第一个:

{{m1[0][0], m1[0][1], m1[0][2],..., m1[0][99]},
 {m1[1][0], m1[1][1], m1[1][2],..., m1[1][99]},
 ...
 {m1[99][0], m1[99][1], ..., m1[99][99]}}

第二个:

{{m2[0][0], m2[0][1], m2[0][2],..., m2[0][99]},
 {m2[1][0], m2[1][1], m2[1][2],..., m2[1][100]},
 ...
 {m2[99][0], m2[99][1], ..., m2[99][99]}}

但是你在读取m1数组的第一个循环中有错误:

for (a = 0; b < row; i++)

然后在你的比较循环中,你有:

m1[row][col] != m2[row][col]

比较具有相同索引的两个矩阵的值。因此,不是将m1[0][0]m2[0][99] 进行比较,而是将m1[0][0]m2[0][0] 进行比较。

【讨论】:

    【解决方案2】:

    您可以使用 2 个嵌套循环来验证此属性:

    #include <stdio.h>
    
    #define COLS 3
    #define ROWS 2
    
    int main(void) {
        int array1[ROWS][COLS] = { { 2, 5, 10 }, { 2, 1, 9 } };
        int array2[ROWS][COLS] = { { 10, 5, 2 }, { 9, 1, 2 } };
        int xmirror = 1;
        int ymirror = 1;
        int xymirror = 1;
    
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                if (array1[i][j] != array2[i][COLS - 1 - j])
                    xmirror = 0;
                if (array1[i][j] != array2[ROWS - 1 - i][j])
                    ymirror = 0;
                if (array1[i][j] != array2[ROWS - 1 - i][COLS - 1 - j])
                    xymirror = 0;
            }
        }
        if (xymirror)
            printf("Mirror image to each other rowwise and columnwise\n");
        if (ymirror)
            printf("Mirror image to each other rowwise\n");
        if (xmirror)
            printf("Mirror image to each other columnwise\n");
        if (xmirror + ymirror + xymirror == 0)
            printf("Not a mirror image of each other\n");
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      简单而简短:

      #include <stdio.h>
      #define size 3
      
      int main (void){
          int i,j,k,flag=1;
          int array1[][size] = { { 2, 5, 10},{ 2, 1, 9 } }, array2[][size] = { {10, 5, 2 }, { 9, 1, 2 } };
      
          //Check mirror image or not
          for(i=0;i<size-1;i++) {
              for(j=0,k=size-1;j<size;j++,k--) {
                  if(array1[i][j]!=array2[i][k]) {
                      flag=0;
                      break;
                  }
              }
          }
          if(flag)
              printf("Mirror image to each other");
          else
              printf("Not a mirror image to each other");
          return 0;
      }
      

      【讨论】:

      • 非常感谢。我需要将它用于 2d 和 3d 矩阵,但我了解如何启动 for 循环,所以我现在应该没问题。谢谢。顺便说一句,为什么大小必须是一个常数?
      • 对大小没有限制是一个常数。你也可以在运行时调整大小。
      • 为什么需要tmp 数组?
      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多