C++:魔方:检查数组中的两个值
C++: Magic Square: Checking two values in an array
警告:我对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;
}
}
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在for循环中包含两个索引值的测试条件
- 在声明中合并两个常量"std::set"(不是在运行时)
- C++:魔方:检查数组中的两个值