预警:我在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;
}
答案 0 :(得分:0)
在这一行:
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;
}
}
答案 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
}
但请注意:您的代码有更多问题