【问题标题】:C++: Magic Square: Checking two values in an arrayC++:魔方:检查数组中的两个值
【发布时间】:2013-10-16 22:17:01
【问题描述】:

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

【问题讨论】:

    标签: c++ arrays compare magic-square


    【解决方案1】:

    要检查数组是否为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++ 中的数组通常索引为 array[row][column],而不是您的情况下的 [x][y]

    【讨论】:

      【解决方案2】:

      在这一行:

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

      您正在使用一个名为array 的二维数组。当您只给它一个索引(eg 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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多