C++:魔方:检查数组中的两个值

C++: Magic Square: Checking two values in an array

本文关键字:两个 魔方 检查 数组 C++      更新时间:2023-10-16

警告:我对C++很陌生,这可能是一个非常基本的问题。我正在尝试读取包含一系列数字的.txt文件,将它们放入数组中,然后检查数组以查看它是否是真正的魔方。我已经完成了第一步,但是嵌套的 for 循环一直说我在数组中有重复 #s。我不知道我的逻辑是错误的,还是我只是检查了错误的数据。

...
bool flag=1;
int N;
string placeholder = "    ";

{
int array[10][10];
ifstream inputFile;
inputFile.open("MAGIC.txt");

inputFile>>N;
for (int x=0;x<N;x++){
    for (int y=0;y<N;y++){
        inputFile >> array[x][y];
    }
    }
for (int x=0;x<N;x++){
    for (int y=0;y<N;y++){
cout<<array[x][y]<<placeholder;
       }
    cout<<endl;
       }
//Everything above works great. 
//The following code changes "flag" to 0 every first loop
//I think it's checking the position instead of the value, but I don't know

for(int row=0;row<N;row++) {
for(int col=0;col<N;col++){
if(array[row]==array[col])  
flag=0;     break;
}
}
...
if(flag==1)
cout<<"Magic square"<<endl;
else
cout<<"No magic square"<<endl;    

  return 0;
}

要检查数组是否是魔方,您需要计算所有行和列的总和

这是用于此的代码:

int flag = 1; // suppose it is magic square
int sum = 0;
for (int j=0; j<N; j++)
    sum += array[0][i]; // calculate sum for first row of array
for (int i=1; i<N; i++) // checking all rows
{
    int tsum = 0;
    for (int j=0; j<N; j++)
        tsum += array[i][j];
    if (tsum != sum)
    {
        flag = 0; break;
    }
}
if (flag)
{
    for (int j=0; i<N; i++) // checking all columns
    {
        int tsum = 0;
        for (int i=0; i<N; i++)
            tsum += array[i][j];
        if (tsum != sum)
        {
            flag = 0; break;
        }
    }
    // here you need to add code to check 2 diagonals
}

但注意:您的代码有更多问题

  1. 您正在从文件中读取 N,但数组初始化是通过 const 10 完成的,如果 N 为 10000 怎么办?
  2. c/c++ 中的数组通常索引为 array[row][column],而不是像您的情况那样索引为 [x][y]

在此行中:

if(array[row]==array[col]) 

您正在使用名为 array 的 2D 数组。 当你只给它一个索引(例如array[row])时,编译器会把它转换为该数组中的指针。 所以这条线是测试指针。 只有当rowcol相等时,它们才会相等。 这肯定会发生,因为您在相同的范围内循环,因此您将始终清除flag。 我不认为这是你的意图。

我不知道测试魔方的逻辑是什么,但你需要重新思考。 我假设您需要比较单个值。

如果你想确保你的数字是唯一的,并且在1到100之间,请尝试这样的事情:

char used[100] = {0};
int maxIdx = N * N - 1;
for( int x=0; x<N; x++ ) {
    for( int y=0; y<N; y++ ) {
        int idx = array[x][y] - 1;
        if( idx < 0 || idx > maxIdx || used[idx] ) {
            flag = 0;
            break;
        }
        used[idx] = 1;
    }
}