C ++:Magic Square:检查数组中的两个值

时间:2013-10-16 22:17:02

标签: c++ arrays compare magic-square

预警:我在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;
}

2 个答案:

答案 0 :(得分:0)

在这一行:

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;
    }
}

答案 1 :(得分:0)

要检查数组是否为magic square,您需要计算所有行和列的总和

这是代码:

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 ++中的数组通常索引为数组[row] [column],而不是像你的情况那样[x] [y]