C ++: магический квадрат: проверка двух значений в массиве

Предупреждение: я очень новичок в 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;
}

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
}

но обратите внимание: у вашего кода больше проблем

  1. вы читаете N из файла, но инициализация массива выполняется через const 10, что если N будет 10000?
  2. Массивы в c / c ++ обычно индексируются как массив [row] [column], а не [x] [y], как в вашем случае
0

Другие решения

В этой строке здесь:

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;
}
}
0

По вопросам рекламы [email protected]