【问题标题】:Finding Duplicate value in 2d array 3x3 magic Square在二维数组 3x3 魔方中查找重复值
【发布时间】:2016-01-10 06:18:02
【问题描述】:

我正在尝试创建一个 2D 数组 3x3 正方形。

计算和检查完成。 现在,我正在努力防止二维数组中出现重复数字。

我尝试使用 for 循环蛮力,但 cygwin 编译给我错误

下面是我的代码。 如何检查二维数组?

    #include <stdio.h> /* printf */

    /*Preprocessor*/
    /*set N constant 3*/
    #define N 3
    typedef enum {false,true}
    bool;

int main()
{
   /*initialize size to 3*/
   int size =3;
   int sum, sum1, sum2,array[N][N];
   int row, col = 0;

   int i, j, duplicate =0;


   /* variable to 
   indicate process reached*/
   int checkf =0;



   /*input into the array of an array*/
   for(row =0; row <size; row++)
   {
     for(col =0; col < size; col++)
     {
       scanf("%d", &array[row][col]);
     }
   }

   **/*check for repeated values*/
   for(row =0; row<9; row++)
  {
    for(col=0; col <9; col++)
    {
      if(array==array[row][col])
    }      
   }**







 /*Diagonal*/
 /*sum of diagonal from the left 
 equals to sum of diagonal 
 from the right */
  /*initialize sum2 to 0*/
   sum2 =0;
   /*check if row less than 3*/
   for(row=0; row< size; row++)
   {
     /*check if col less than 3*/
    for(col=0;col<size; col++)
     {
       /*number of row 
       equals number of col*/
       if(row == col)
       {
       /*addition*/
       sum2 = sum2 + array[row][col]; 
       }
     }
   }

 /*row*/
   /*check if row less than 3*/
   for(row=0; row < size; row++)
   {
     /*initialize sum */
     sum = 0;
     /*check if col less than 3*/
      for(col=0; col <size; col++)
      {
       /*addition of numbers*/
       sum = sum + array[row][col];
      }
     /*check if all additions
     adds up to same sum*/
     if(sum2 == sum)
     {
      /*a flag or check to print*/
      checkf =1;
     }
     else
     {
      /*a flag or check to print*/
      checkf =0;
      break;
     }  
   }

   /*Columns*/

   /*check if row less than 3*/
   for(row = 0; row < size; row++)
   {
     /*initialize sum */
     sum1 =0;
     /*check if col less than 3*/
     for(col = 0; col < size; col++)
     {
       /*addition*/
       sum1 = sum1 + array[col][row];
     }
     /*sum of diagonal equals
     sum of columns*/
     if(sum == sum1)
     {
       /*a flag or check to print*/
       checkf =1;
     }
     else
     {
       /*a flag or check to print*/
       checkf =0;
       break;
     }
   }


   /*if statement is true
   prints and display*/
   if(checkf ==1)
   {
     printf("This is a magic square.\n");
   }
   else
   {
     /*print and display*/
     printf("This is not a magic square.\n");
   }
   return 0;

}

【问题讨论】:

  • "但是 cygwin 编译给我错误" -- 错误是什么?错误消息对我们非常有用。
  • if(array==array[row][col]) 看起来不对。您还需要两个循环来检查。见this answer
  • 嗨帅哥!我尝试应用之前的逻辑。我对 i 和 j 的工作原理感到困惑。

标签: c arrays 2d


【解决方案1】:

如果您有一个扁平的一维数组(例如,固定大小 N),您将根据其左侧的每个元素检查所有元素:

int unique1d(int array[N])
{
    int i, j;

    for(i = 1; i < N*N; i++) {
        for(j = 0; j < i; j++) {
            if (array[i] == array[j]) return 0;
        }
    }

    return 1;    
}

当您首先“展平”索引时,您可以对二维数组执行相同的操作。假设您使用“平面”索引枚举 3×3 网格的单元格,如下所示:

0   1   2
3   4   5
6   7   8

然后你得到:

flat = row * N + col;

反过来说:

row = flat / N;      // truncating int division gives row
col = flat % N;      // remainder gives column

因此,测试N×N 网格中是否存在重复项的函数如下所示:

int unique(int array[N][N])
{
    int i, j;

    for(i = 1; i < N*N; i++) {
        for(j = 0; j < i; j++) {
            if (array[i / 3][i % 3] == array[j / 3][j % 3]) return 0;
        }
    }

    return 1;    
}

我把它做成了一个单独的函数,因为它使代码更清晰。不是你不需要单独的标志和break。您可以在找到结果后立即显式返回结果。 (另外,break 必须跳出嵌套循环,但 C 中的 break 关键字只是跳出内部循环。)

(检查正方形是否是魔法的其余代码看起来也有点可疑。例如,您应该从假设正方形是魔法开始,然后将您的标志设置为false,如果一个魔方的条件不成立。您永远不必再次将该标志设置回true。但这是另一个问题的主题。)

编辑:为了更好地解释功能,这里是示例客户端代码。这本质上是你的程序,没有魔法检查。 N 必须是一个已定义的常量,就像在您的程序中一样。

int main()
{
    int array[N][N];
    int row, col;

    for(row =0; row < N; row++) {
        for(col =0; col < N; col++) {
            scanf("%d", &array[row][col]);
        }
    }

    if (unique(array)) {
        puts("Values are unique");
    } else {
        puts("There are duplicate values.");
    }

    return 0;
}

【讨论】:

  • 我应该调用一个带有指针的二维数组的函数吗?
  • q1.c:在函数“repeatedValues”中:q1.c:37:5:警告:return 使指针从没有强制转换的整数返回 1; ^ q1.c:在函数“main”中:q1.c:49:5:警告:赋值使指针从整数而不进行强制转换 p=array[N][N]; ^ q1.c:53:4: 警告:ISO C90 禁止混合声明和代码 [-Wpedantic] int checkf =0; ^ q1.c:66:19: 警告:从不兼容的指针类型repeatedValues(p) 传递“repeatedValues”的参数1; ^ q1.c:26:6: 注意:预期为“int (*)[3]”,但参数类型为“int *” int *repeatedValues(int array[N][N])
  • @GeraldLee 尝试使用int repeatedValues(int array[N]) 而不是int* repeatedValues(int array[N][N]),或者只使用int repeatedValues(int array[N][N]) 并使用repeatedValues(array); 调用该函数。顺便说一句,p=array[N][N]; 看起来不对。也许你想要int* p = *array;
  • 我添加了一个示例main,以便您了解如何使用该功能。请不要只是将错误消息粘贴到 cmets 中;它是不可读的,并且在没有您的代码的情况下也没有用。
  • 嗨 Oehm,很抱歉出现错误消息。所以基本上你想要做的是你将一个函数调用到main中。一旦被调用,它会检查函数内部的条件,并相应地 printf 或执行某些操作?
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多