警告:我对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
}
但注意:您的代码有更多问题
- 您正在从文件中读取 N,但数组初始化是通过 const 10 完成的,如果 N 为 10000 怎么办?
- c/c++ 中的数组通常索引为 array[row][column],而不是像您的情况那样索引为 [x][y]
在此行中:
if(array[row]==array[col])
您正在使用名为 array
的 2D 数组。 当你只给它一个索引(例如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;
}
}