Предупреждение: я очень новичок в C ++, и это, вероятно, очень простая проблема. Я пытаюсь прочитать в файле .txt, содержащем последовательность чисел, поместить их в массив, а затем проверить массив, чтобы увидеть, действительно ли это магический квадрат. Я сделал первый шаг, но вложенный цикл повторяет, что в массиве есть повторяющиеся символы #. Я не знаю, неверна ли моя логика или просто проверяю неверные данные.
...
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 knowfor(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
}
но обратите внимание: у вашего кода больше проблем
В этой строке здесь:
if(array[row]==array[col])
Вы используете 2D-массив с именем 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;
}
}