0

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

2 回答 2

0

在此行中:

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

您正在使用一个名为array. 当您只给它一个索引(例如 array[row])时,编译器会将其转换为该数组中的一个指针。所以那条线正在测试指针。只有当row和相等时,它们才会col相等。这保证会发生,因为您循环遍历相同的范围,因此您将始终清除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;
    }
}
于 2013-10-16T22:22:44.617 回答
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]
于 2013-10-16T22:25:36.920 回答