Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить среднее арифметическое простых чисел последовательности http://www.cyberforum.ru/cpp-beginners/thread969548.html
Господа, доброго времени суток. Я только начинающий относительно С++ и мне нужна помощь. Необходимо написать решение: Вводится последовательность целых чисел, 0 – конец последовательности. Определить среднее арифметическое простых чисел последовательности (результатом функции будет 1 – число простое, 0 - нет). Я вроде как написал, но программа выводит 0, прошу помощи. int main() { int...
C++ Не могу разобраться в vector<> Доброго времени суток. Не могу понять реализацию вектора, да и вообще с векторами плохо знакома. Мне бы только показать, как ввести данные и вывести, думаю после сразу будет понятно, что к чему. Вот код: Кстати это алгоритм Крускала(теория графов: Минимальное островное дерево") http://www.cyberforum.ru/cpp-beginners/thread969539.html
C++ ПОдскажите почему не работает rand?
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; struct item { int data; // данные item * next; // указатель на следующий элемен };
C++ Порядок вершин при поиске кратчайшего пути
Есть алгоритм Дейкстры для поиска кратчайшего пути между вершинами. Прога ищет путь правильно и выдает число равное длине минимального пути, но никак не могу правильно сохранить сами номера вершин для их вывода(т.е. порядок вершин в кратчайшем пути). Не знаю в чем дело какие только условия отбора вершин не ставил, не могу придумать, не хватает опыта в программировании. #include <iostream>...
C++ Ошибка константа. как исправить? http://www.cyberforum.ru/cpp-beginners/thread969521.html
помогите пожалуйста, как убрать эту ошибку?
C++ Странное на мой взгляд объявление функции Добрый день. В исходниках усмотрел следующую вещь: void __RPC_STUB IAMCollection_get_Count_Stub( IRpcStubBuffer *This, IRpcChannelBuffer *_pRpcChannelBuffer, PRPC_MESSAGE _pRpcMessage, DWORD *_pdwStubPhase); Теперь мучает вопрос, что сие есть. То есть что есть когда после типа возвращаемого функцией значения пишется какая-нибудь ересь, что это означает и что делает.... подробнее

Показать сообщение отдельно
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
05.10.2013, 19:06     Определить ,является ли заданная квадратная матрица магическим квадратом
Цитата Сообщение от haveystar Посмотреть сообщение
Написать программу,которая позволяет определить ,является ли заданная квадратная матрица магическим квадратом ,то есть такой , в которой суммы элементов во всех рядках и столбцах одинаковые !!
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
                          /*** -std=c++03 ***/
#include <iostream>
 
enum Type {MAGIC, NOMAGIC} flag = MAGIC; // Сразу считаем, что матрица магическая.
 
int main( int argc, char* argv[] )
{
    const size_t rowSize = 5, colSize = 5;
    int matrix[rowSize][colSize] =
    {
        {1, 15, 24, 8, 17 },
        {9, 18, 2, 11, 25 },
        {12, 21, 10, 19, 3},
        {20, 4, 13, 22, 6 },
        {23, 7, 16, 5, 14 }
    };
    int sum = 0;
    for(size_t i = 0; i < colSize; ++i)
        sum += matrix[0][i];
 
 
    int currentRowSum = 0, currentColSum = 0;
 
    // Проверяем сумму в столбцах.
    for(size_t i = 0; i < colSize; ++i)
    {
        for(size_t j = 0; j < rowSize; ++j)
            currentColSum += matrix[j][i];
        // Если не совпадает с эталоном - матрица не магическая - выходим.
        if(currentColSum != sum)
        {
            flag = NOMAGIC;
            break;
        }
        currentColSum = 0; // Обнуляем для следующего подсчета.
    }
 
    // Проверяем сумму в строках (аналогично).
    if(flag == MAGIC)
    {
        for(size_t i = 0; i < rowSize; ++i)
        {
            for(size_t j = 0; j < colSize; ++j)
                currentRowSum += matrix[i][j];
            if(currentRowSum != sum)
            {
                flag = NOMAGIC;
                break;
            }
            currentRowSum = 0;
        }
    }
 
    if(flag == MAGIC)
        std::cout <<"MAGIC square!" <<std::endl;
    else
        std::cout <<"SIMPLE square!" <<std::endl;
 
    return EXIT_SUCCESS;
}

Вариант прямолинейный, но рабочий. Как либо оптимизировать лень.
Добавлено через 4 минуты
Ах да! Чтобы квадрат считался магическим, нужно чтобы сумма элементов двух диагоналей также была одинаковой. Но хозяин -- барин, как говорится .

Добавлено через 32 минуты
Ладно, глазам больно смотреть. Версия 2 (с проверкой диагоналей, не оптимизированная):

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
                          /*** -std=c++03 ***/
#include <iostream>
 
int main()
{
    bool isMagic = true; // Сразу считаем, что матрица магическая.
    const size_t size = 5;
    int matrix[size][size] =
    {
        {1, 15, 24, 8, 17 },
        {9, 18, 2, 11, 25 },
        {12, 21, 10, 19, 3},
        {20, 4, 13, 22, 6 },
        {23, 7, 16, 5, 14 }
    };
    int sum = 0;
    for(size_t i = 0; i < size; ++i)
        sum += matrix[0][i];
 
 
    int rowSum = 0, colSum = 0, mainDiagonalSum = 0, sideDiagonalSum = 0;
 
    // Проверяем сумму в столбцах.
    for(size_t i = 0; i < size; ++i)
    {
        for(size_t j = 0; j < size; ++j)
            colSum += matrix[j][i];
        // Если не совпадает с эталоном - матрица не магическая - выходим.
        if(colSum != sum)
        {
            isMagic = false;
            break;
        }
        colSum = 0; // Обнуляем для следующего подсчета.
    }
 
    // Проверяем сумму в строках (аналогично).
    if(isMagic)
    {
        for(size_t i = 0; i < size; ++i)
        {
            for(size_t j = 0; j < size; ++j)
                rowSum += matrix[i][j];
            if(rowSum != sum)
            {
                isMagic = false;
                break;
            }
            rowSum = 0;
        }
    }
 
    // Главная диагональ.
    if(isMagic)
    {
        for(size_t i = 0; i < size; ++i)
            mainDiagonalSum += matrix[i][i];
 
        if(mainDiagonalSum != sum)
            isMagic = false;
    }
 
    // Побочная диагональ (подымаемся с левого нижнего в правый верхний угол).
    if(isMagic)
    {
        size_t i = size-1, j = 0;
        while( j < size ) // i проверять бессмысленно.
            sideDiagonalSum += matrix[i--][j++];
 
        if(sideDiagonalSum != sum)
            isMagic = false;
    }
 
    if(isMagic)
        std::cout <<"MAGIC square!" <<std::endl;
    else
        std::cout <<"SIMPLE square!" <<std::endl;
 
    return EXIT_SUCCESS;
}
 
Текущее время: 08:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru