Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
AlisherIITU
2 / 2 / 3
Регистрация: 10.09.2013
Сообщений: 129
#1

Проверить, является ли матрица магическим квадратом - C++

15.10.2013, 09:54. Просмотров 1684. Ответов 7
Метки нет (Все метки)

Магический квадрат является расположение чисел в квадратной сетке, где числа в каждой строке и в каждом столбце, а числа в прямом и обратном главных диагоналях, сумма равна.Магический квадрат имеет такое же количество строк, как это имеет столбцы, а в обычной математической нотации, "N" означает количество строк (и столбцов) он имеет. Таким образом, магический квадрат всегда содержит N2 номера

Вход:
Целое число N как число строк и столбцов (3 <= N <100). Тогда матрица NxN.
Выход:
Dispay "Да", если введенная матрица является магическим квадратом, в противном случае вывести "Нет".

Sample input:
3
4 9 2
3 5 7
8 1 6
Sample output:
Yes

Sample input:
3
1 2 3
4 5 6
7 8 9
Sample output:
No

Помогите решить, с помощью двумерного массива
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2013, 09:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверить, является ли матрица магическим квадратом (C++):

Проверить, является ли матрица магическим квадратом
Здравствуйте! Решил задачку с сайта http://informatics.mccme.ru, но в двух...

Проверить, является ли матрица, записанная в файле, магическим квадратом
Здравствуйте,помогите пожалуйста создать код на c++ который проверяет...

Проверить является ли квадратная матрица " магическим квадратом"
Дан двумерный массив размером n х n , заполненный целыми числами. Выяснить,...

Проверить, является ли введенная с клавиатуры квадратная матрица "Магическим квадратом"
Написать программу, которая проверяет, является ли введенная с клавиатуры ...

Проверить, является ли введенная с клавиатуры квадратная матрица "магическим" квадратом
Написать программу, которая проверяет, является ли введенная с клавиатуры...

Проверить является ли матрица "магическим" квадратом
. Написать программу, которая проверяет, является ли введенная с клавиатуры...

7
Folko
265 / 253 / 27
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
15.10.2013, 10:11 #2
AlisherIITU, а в чем проблема? Находите 1 значение из всего этого, и начинаете сверять сначала все строки (в цикле), потом столбы, потом диагонали. Если хоть одно значение не совпадает, значит квадрат не магический
0
AlisherIITU
2 / 2 / 3
Регистрация: 10.09.2013
Сообщений: 129
15.10.2013, 11:05  [ТС] #3
Цитата Сообщение от Folko Посмотреть сообщение
AlisherIITU, а в чем проблема? Находите 1 значение из всего этого, и начинаете сверять сначала все строки (в цикле), потом столбы, потом диагонали. Если хоть одно значение не совпадает, значит квадрат не магический
Вот посмотрите исправьте если че, а как дальше продолжить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
int main ()
{
    int arr[100][100];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            cin>>arr[i][j];
        }
        //sum rows
    int rows[100];
     for(int i=0;i<n;i++)
    {   for(int j=0;j<n;j++)
            rows[i]+=arr[i][j];
        cout<<rows[i]<<endl;
    }
     //sum column
     int column[100];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                column[j]+=arr[i][j];
                cout<<column[j]<<endl;
            }
    //sum main diagonal
            int main = 0;
             for(int i=0;i<n;i++)
              main+= arr[i][i];
             cout<<main<<endl;
   //sum second diagonal
             int second = 0;
             for(int i=0;i<n;i++)
             second+= arr[i][n-i-1];
0
Folko
265 / 253 / 27
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
15.10.2013, 11:08 #4
AlisherIITU, секунду, распишу
0
Max Dark
шКодер самоучка
1886 / 1686 / 832
Регистрация: 09.10.2013
Сообщений: 3,741
Записей в блоге: 6
Завершенные тесты: 2
15.10.2013, 11:08 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
 
using namespace std;
void create(int** &table, int size) {
    /* выделяем память, вводим значения
     * */
    int i,j;
    table=new int*[size];
    for(i=0; i<size; i++) {
        table[i] = new int[size];
        for(j=0; j<size; j++) {
            cout<<"enter element["<<i<<"]["<<j<<"] :";
            cin>>table[i][j];
        }
    }
}
 
void destroy(int** &table, int size) {
    /* Освобождаем память
     * */
    int i;
    for(i=0; i<size; i++) {
        delete [] table[i];
    }
    delete []table;
}
int sumRow(int** &table, int size,int i) {
    // подсчитывает сумму в строке
    int sum,j;
    sum=0;
    for(j=0;j<size;j++)
        sum+=table[i][j];
    return sum;
}
int sumCol(int** &table, int size,int j) {
    // Вычисляет сумму в столбце
    int sum,i;
    sum=0;
    for(i=0;i<size;i++)
        sum+=table[i][j];
    return sum;
}
bool checkRows(int** table, int size) {
    // проверяет по строкам
    int i;
    int sum1,sum2;
    sum1 = sumRow(table, size, 0);
    for(i=1;i<size;i++) {
        sum2 = sumRow(table,size,i);
        if(sum1 != sum2) return false;
    }
    return true;
}
 
bool checkCols(int** table, int size) {
    // проверяет по столбцам
    int i;
    int sum1,sum2;
    sum1 = sumCol(table, size, 0);
    for(i=1;i<size;i++) {
        sum2 = sumCol(table,size,i);
        if(sum1 != sum2) return false;
    }
    return true;
}
 
bool checkDiag(int** table, int size) {
    // проверяет диагонали
    int i,j;
    int sum1,sum2;
    sum1=0;
    sum2=0;
    for(i=0;i<size;i++){
        j=size-i-1;
        sum1+=table[i][j];
        sum2+=table[j][i];
    }
    return (sum1 == sum2);
}
 
int main(int argc, char** argv) {
    int n;
    int** table;
    cout<<"enter n: ";
    cin>>n;
    create(table, n);
    if (checkCols(table, n) &&
            checkRows(table, n) &&
            checkDiag(table, n))
        cout<<"its magic"<<endl;
    else
        cout<<"its not magic"<<endl;
    destroy(table, n);
    return 0;
}
примерно так
0
AlisherIITU
2 / 2 / 3
Регистрация: 10.09.2013
Сообщений: 129
15.10.2013, 11:14  [ТС] #6
Цитата Сообщение от Cra3y Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
 
using namespace std;
void create(int** &table, int size) {
    /* выделяем память, вводим значения
     * */
    int i,j;
    table=new int*[size];
    for(i=0; i<size; i++) {
        table[i] = new int[size];
        for(j=0; j<size; j++) {
            cout<<"enter element["<<i<<"]["<<j<<"] :";
            cin>>table[i][j];
        }
    }
}
 
void destroy(int** &table, int size) {
    /* Освобождаем память
     * */
    int i;
    for(i=0; i<size; i++) {
        delete [] table[i];
    }
    delete []table;
}
int sumRow(int** &table, int size,int i) {
    // подсчитывает сумму в строке
    int sum,j;
    sum=0;
    for(j=0;j<size;j++)
        sum+=table[i][j];
    return sum;
}
int sumCol(int** &table, int size,int j) {
    // Вычисляет сумму в столбце
    int sum,i;
    sum=0;
    for(i=0;i<size;i++)
        sum+=table[i][j];
    return sum;
}
bool checkRows(int** table, int size) {
    // проверяет по строкам
    int i;
    int sum1,sum2;
    sum1 = sumRow(table, size, 0);
    for(i=1;i<size;i++) {
        sum2 = sumRow(table,size,i);
        if(sum1 != sum2) return false;
    }
    return true;
}
 
bool checkCols(int** table, int size) {
    // проверяет по столбцам
    int i;
    int sum1,sum2;
    sum1 = sumCol(table, size, 0);
    for(i=1;i<size;i++) {
        sum2 = sumCol(table,size,i);
        if(sum1 != sum2) return false;
    }
    return true;
}
 
bool checkDiag(int** table, int size) {
    // проверяет диагонали
    int i,j;
    int sum1,sum2;
    sum1=0;
    sum2=0;
    for(i=0;i<size;i++){
        j=size-i-1;
        sum1+=table[i][j];
        sum2+=table[j][i];
    }
    return (sum1 == sum2);
}
 
int main(int argc, char** argv) {
    int n;
    int** table;
    cout<<"enter n: ";
    cin>>n;
    create(table, n);
    if (checkCols(table, n) &&
            checkRows(table, n) &&
            checkDiag(table, n))
        cout<<"its magic"<<endl;
    else
        cout<<"its not magic"<<endl;
    destroy(table, n);
    return 0;
}
примерно так
мне ваш код к сожалению не очень понятен т.к я не очень знаком с void и bool
0
Max Dark
шКодер самоучка
1886 / 1686 / 832
Регистрация: 09.10.2013
Сообщений: 3,741
Записей в блоге: 6
Завершенные тесты: 2
15.10.2013, 11:22 #7
void - пустое значение, означает что функция не возвращает значения
bool - значения "истина" или "ложь" true - истина, false - ложь
0
Folko
265 / 253 / 27
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
15.10.2013, 11:58 #8
AlisherIITU,
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
int main(int argc, char *argv[])
{
    QTextStream cout(stdout);
    QTextStream cin(stdin);
    int size;
    cout << "size array:" << endl;
    cin >> size;
    int arr[size][size];
    for (int i=0;i<size;i++)
        for (int j=0;j<size;j++)
        {
            cout << "arr[" << i << "][" << j << "]: " << endl;
            cin >> arr[i][j];
        }
    cout << endl << "ARRAY:" << endl;
    for (int i=0;i<size;i++)
    {
        for (int j=0;j<size;j++) cout << arr[i][j] << "   ";
        cout << endl;
    }
    bool magic = true;
    int test = 0;
    for (int i=0;i<size;i++) test += arr[i][0];
    int counter = 0;
    int summ = 0;
    while (counter < size && magic)
    {
        summ = 0;
        for (int i=0;i<size;i++) summ += arr[counter][i];
        if (summ != test) magic = false;
        counter++;
    }
    while (counter < size && magic)
    {
        summ = 0;
        for (int i=0;i<size;i++) summ += arr[i][counter];
        if (summ != test) magic = false;
        counter++;
    }
    summ = 0;
    for (int i=0;i<size;i++)
    {
        summ += arr[i][i];
    }
    if (summ != test) magic = false;
    summ = 0;
    for (int i=0;i<size;i++)
    {
        summ += arr[size-i-1][i];
    }
    if (summ != test) magic = false;
 
    if (magic) cout << "MAGIC!" << endl;
    else cout << "NOT MAGIC!" << endl;
    return 0;
}
как то так
1
15.10.2013, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2013, 11:58
Привет! Вот еще темы с решениями:

Проверить, является ли матрица "магическим квадратом"
Все привет, возникла проблема. Мне дали следующие задание:&quot;Дан символьный...

Является ли матрица магическим квадратом
Является ли матрица магическим квадратом

Является ли матрица магическим квадратом
Определить, является ли заданная целочисленная квадратная матрица порядка 9...

Определить является ли матрица магическим квадратом
Имеется массив 3х3. определить является ли такая матрица магическим квадратом....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru