gpt4 book ai didi

c - 在 2d 数组 3x3 幻方中查找重复值

转载 作者:行者123 更新时间:2023-11-30 15:13:19 31 4
gpt4 key购买 nike

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

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

我尝试使用 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;

}

最佳答案

如果您有一个平面的一维数组(例如,固定大小 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 关键字只是跳出内部循环。)

(检查方 block 是否为魔法的其余代码看起来也有点可疑。例如,您应该从假设方 block 为魔法开始,然后将标志设置为 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;
}

关于c - 在 2d 数组 3x3 幻方中查找重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34702697/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com