0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 21
1

Найти квадратные подматрицы, которые симметричны относительно главной диагонали

21.03.2020, 12:21. Показов 1540. Ответов 1

Всем доброго времени суток.

Столкнулся со следующей задачей: в прямоугольной матрице найти квадратные подматрицы, которые симметричны относительно главной диагонали.
Подскажите, каким образом можно решить данную задачу, ибо в голову совсем ничего не приходит.

Всем спасибо за ответы.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2020, 12:21
Ответы с готовыми решениями:

Сформировать множество символов, находящиеся в столбцах, элементы которых симметричны относительно главной диагонали
Дана символьная матрица. Сформировать множество символов, находящиеся в столбцах, элементы которых...

Рекурсия: найти число расстановок N ладей, которые симметричны относительно диагоналей и не бьют друг друга
Вычислить рекурсивно число расстановок N ладей на доске N*N таких, что ладьи симметричны...

Сколько матриц симметричны относительно диагонали ..
задана последовательность квадратных матриц. Сколько из них симметричны относительно главной...

Поменять местами элементы квадратной матрицы, которые симметричны побочной диагонали
Поменять местами элементы квадратной матрицы, которые симметричны побочной диагонали. Составить...

1
5695 / 3134 / 1306
Регистрация: 07.02.2019
Сообщений: 7,874
21.03.2020, 14:45 2
Лучший ответ Сообщение было отмечено Saladorys как решение

Решение

Пример интерфейса, который можно использовать для перебора подматриц.
Проверку подматрицы на симметрию реализуй сам.
Кликните здесь для просмотра всего текста
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
96
97
98
99
100
101
102
103
#include <iostream>
#include <iomanip>
#include <vector>
#include <cassert>
//////////////////////////////////////////////////////////////////////////////////////
// шаблон класса матриц
template<class T> class Matrix
{
    size_t m_rows;
    size_t m_cols;
    std::vector<T> m_data;
 
public:
 
    Matrix(size_t rows, size_t cols) : m_rows(rows), m_cols(cols), m_data(rows* cols)
    {
        assert(m_rows && m_cols);
        assert(m_rows <= m_data.max_size() / m_cols);
    }
 
    T* operator[](size_t row) { return m_data.data() + row * m_cols; }
    const T* operator[](size_t row) const { return m_data.data() + row * m_cols; }
 
    size_t rows() const { return m_rows; }
    size_t cols() const { return m_cols; }
};
//////////////////////////////////////////////////////////////////////////////////////
// шаблон класса подматрицы, имеет ссылочную семантику и похожий интерфейс
template<class T> class Sub_mat_cref
{
    size_t m_row;
    size_t m_col;
    size_t m_rows;
    size_t m_cols;
    const Matrix<T>& ref;
 
public:
 
    Sub_mat_cref(size_t row, size_t col, size_t rows, size_t cols, Matrix<T>& mat)
        : m_row(row), m_col(col), m_rows(rows), m_cols(cols), ref(mat)
    {
        assert(m_rows && m_cols);
        assert(m_row + m_rows <= ref.rows());
        assert(m_col + m_cols <= ref.cols());
    }
 
    const T* operator[](size_t row) const
    {
        return ref[row + m_row] + m_col;
    }
 
    size_t rows() const { return m_rows; }
    size_t cols() const { return m_cols; }
};
//////////////////////////////////////////////////////////////////////////////////////
// на это не обращай внимания, можно просто написать две перегрузки с идентичным кодом
#include <type_traits>
template<
    template<class> class M,
    class T,
    typename = std::enable_if_t<std::is_same<M<T>, Matrix<T>>::value || std::is_same<M<T>, Sub_mat_cref<T>>::value>
>
std::ostream& operator<<(std::ostream& os, const M<T>& mat)
{
    for (size_t row{}; row < mat.rows(); ++row)
    {
        for (size_t col{}; col < mat.cols(); ++col)
        {
            os << std::setw(6) << mat[row][col];
        }
        os << std::endl;
    }
    return os;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    constexpr size_t rows = 3;
    constexpr size_t cols = 5;
    constexpr size_t sub_size = 2;
 
    Matrix<int> mat(rows, cols);
    // заполняем основную матрицу
    for (size_t row{}; row < mat.rows(); ++row)
    {
        for (size_t col{}; col < mat.cols(); ++col)
        {
            mat[row][col] = row * cols + col;
        }
    }
    // выводим на экран основную матрицу
    std::cout << "Source:\n";
    std::cout << mat << std::endl;
    // выводим на экран все подматрицы 2x2 основной матрицы
    std::cout << "Subs2x2:\n";
    for (size_t row{}; row <= mat.rows() - sub_size; ++row)
    {
        for (size_t col{}; col <= mat.cols() - sub_size; ++col)
        {
            std::cout << Sub_mat_cref<int>(row, col, sub_size, sub_size, mat) << std::endl;
        }
    }
}

https://rextester.com/QQRX24451
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2020, 14:45
Помогаю со студенческими работами здесь

Поменять элементы в матрице относительно симметрично относительно главной диагонали
Дана квадратная матрица поменять в ней элементы симметричные относительно главной диагонали !...

Найти максимальное значение матрицы, зеркально отразить ее относительно главной диагонали
Описать статический массив. Массив считывается из текстового файла. определить: Максимальное...

Найти элементы заданной матрицы расположенные в указанном положении относительно главной диагонали
дано матрица x(8.8) найти главный диагональ, найти арифметические элементы которые расположены...

Заполнить двумерный массив 4 на 4 случайными значениями так, чтобы его элементы были симметричны главной диагонали.
Заполнить двумерный массив 4 на 4 случайными значениями так, чтобы его элементы были симметричны...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru