С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.05.2017
Сообщений: 26
1

Массивы и контейнеры

18.02.2020, 23:28. Показов 503. Ответов 4

Author24 — интернет-сервис помощи студентам
Есть статическая матрица 3*3 которая заполняется цифрами (1...9) случайным образом. Мне нужно исключить создание одинаковых матриц. Я попыталась организовать проверку была ли уже создана эта матрица с помощью вектора но выдает ошибку: error C3074: массив может инициализироваться только с помощью списка инициализатора
C++
1
2
3
4
5
6
vector <int[3][3]> H;
vector <int[3][3]>::iterator h;
...
h = find(H.begin(), H.end(), mat);
...
H.push_back(mat); // int mat[3][3] (не пустая)
Как исправить эту ошибку или есть более простой способ?
полный код:
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
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <ctime>
 
using namespace std;
 
int opr(int A[3][3])
{
    return (A[0][0] * A[1][1] * A[2][2]) + (A[0][1] * A[1][2] * A[2][0]) + (A[0][2] * A[1][0] * A[2][1]) - (A[0][2] * A[1][1] * A[2][0]) - (A[0][1] * A[1][0] * A[2][2]) - (A[0][0] * A[1][2] * A[2][1]);
}
void copy(int A[3][3], int B[3][3])
{
    for (int k = 0; k < 3; k++)
        for (int n = 0; n < 3; n++)
            B[k][n] = A[k][n];
}
void print(int A[3][3])
{
    for (int k = 0; k < 3; k++)
    {
        for (int n = 0; n < 3; n++)
            cout << A[k][n] << " ";
        cout << endl;
    }
}
void _tmain()
{
    setlocale(0,"");
    srand(time(0));
    int mat[3][3], mat1[3][3], max = 0, t;
    vector <int> Q, V;
    vector <int[3][3]> H;
    for (int i = 1; i < 10; i++)
        Q.push_back(i);
    vector<int>::iterator q;
    vector <int[3][3]>::iterator h;
    for (int i = 0; i < 362881; i++)
    {
        do{
            for (int k = 0; k < 3; k++)
                for (int n = 0; n < 3; n++)
                {
                    int f;
                    do
                    {
                        f = rand() % 9;
                        q = find(V.begin(), V.end(), f);
                    } while (q != V.end());
                    mat[k][n] = Q[f];
                    V.push_back(f);
                }
            V.clear();
            h = find(H.begin(), H.end(), mat);
        } while (h != H.end());
        H.push_back(mat);
        if (abs(opr(mat)) > max) { max = abs(opr(mat)); t = i; copy(mat, mat1); }
    }
    print(mat1);
    cout << "Определитель = " << max << "    комбинация №" << t << "из 362881" <<endl;
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2020, 23:28
Ответы с готовыми решениями:

Что лучше: динамические массивы, векторы, списки, map контейнеры или что-то ещё?
Привет всем! Помогите правильно алгоритм выбрать. Надо получать из файлов (около 8000 файлов)...

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

Контейнеры
Доброго времени суток! Ребят, очень нужна помощь, есть задание:написать функцию, принимающую...

Контейнеры
Ребят, хочу сделать простенькую игрушку. На форме будет игровое поле и панелька с текущими данными...

4
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
18.02.2020, 23:50 2
DianaZ, у меня стойкое ощущение, что вы почёсываете правой ногой за левым ухом. Покажите формулировку исходной задачи, которую вы решаете столь замысловатым образом.
0
0 / 0 / 0
Регистрация: 25.05.2017
Сообщений: 26
19.02.2020, 00:03  [ТС] 3
Найти матрицу 3 на 3 из цифр от 1 до 9 без повторений с наибольшим определителем по модулю.
0
4865 / 2664 / 913
Регистрация: 29.11.2010
Сообщений: 5,745
19.02.2020, 01:48 4
Действительно очень замысловатый способ.
Вариант перебором: нужно взять девять цифр от 1 до 9, найти все их пермутации без повторений и подобрать максимум.

134217728 перестановок.
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
#include <algorithm>
#include <iostream>
#include <iomanip>
 
using Matrix3 = int[9];
 
std::ostream &operator<<(std::ostream& out, const Matrix3 &m) {
    for (int i = 0; i < 3; ++i) {
        out << "[" << m[i * 3 + 0] << m[i * 3 + 1] << m[i * 3 + 2] << "]" << std::endl;
    }
    return out;
}
 
// Return determinant of
// [ a b ]
// [ c d ]
// which is a*d-b*c
int getDeterminant(int a, int b, int c, int d) {
    return a * d - b * c;
}
 
int getDeterminant(Matrix3 m)
{
    return m[0 * 3 + 0] * getDeterminant(m[1 * 3 + 1], m[1 * 3 + 2], m[2 * 3 + 1], m[2 * 3 + 2])
         - m[0 * 3 + 1] * getDeterminant(m[1 * 3 + 0], m[1 * 3 + 2], m[2 * 3 + 0], m[2 * 3 + 2])
         + m[0 * 3 + 2] * getDeterminant(m[1 * 3 + 0], m[1 * 3 + 1], m[2 * 3 + 0], m[2 * 3 + 1]);
}
 
int main(int argc, char** argv) {
    Matrix3 a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
 
    do {
        std::cout << a << "Determinant: " << getDeterminant(a) << std::endl;
    } while (std::next_permutation(a, a + 9));
 
    return 0;
}
И никаких одинаковых матриц.

Тут без поиска максимума, но, уверен, сообразите.

Добавлено через 21 минуту
Что-то я не уверен, что всё везде правильно.
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
#include <algorithm>
#include <iostream>
#include <iomanip>
 
using Matrix3 = int[9];
 
std::ostream &operator<<(std::ostream& out, const Matrix3 &m) {
    for (int i = 0; i < 3; ++i) {
        out << "[" << m[i * 3 + 0] << m[i * 3 + 1] << m[i * 3 + 2] << "]" << std::endl;
    }
    return out;
}
 
// Return determinant of
// [ a b ]
// [ c d ]
// which is a*d-b*c
int getDeterminant(int a, int b, int c, int d) {
    return a * d - b * c;
}
 
template<typename T>
int getDeterminant(const T &m)
{
    return m[0 * 3 + 0] * getDeterminant(m[1 * 3 + 1], m[1 * 3 + 2], m[2 * 3 + 1], m[2 * 3 + 2])
        - m[0 * 3 + 1] * getDeterminant(m[1 * 3 + 0], m[1 * 3 + 2], m[2 * 3 + 0], m[2 * 3 + 2])
        + m[0 * 3 + 2] * getDeterminant(m[1 * 3 + 0], m[1 * 3 + 1], m[2 * 3 + 0], m[2 * 3 + 1]);
}
 
int main(int argc, char** argv) {
    Matrix3 numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
    Matrix3 maximumMatrix;
    std::copy(numbers, numbers + 9, maximumMatrix);
    int maximumDeterminant = getDeterminant(maximumMatrix);
 
    while (std::next_permutation(numbers, numbers + 9)) {
        int determinant = std::abs(getDeterminant(numbers));
        if (std::abs(determinant) > std::abs(maximumDeterminant)) {
            maximumDeterminant = determinant;
            std::copy(numbers, numbers + 9, maximumMatrix);
        }
    }
 
    std::cout << maximumMatrix << "Determinant: " << maximumDeterminant << std::endl;
 
    return 0;
}
Добавлено через 2 минуты
В результате получил вот такую матрицу.
Код
[148]
[593]
[726]
Determinant: 412
1
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
19.02.2020, 05:10 5
DianaZ, у меня недаром было это стойкое ощущение.

Поскольку меня уже опередили, то просто ограничусь вариацией на тему того же алгоритма, что и у lemegeton, но без алгоритмов STL. Если закрыть глаза на ввод-вывод, это практически чистый С без всяких плюсов.
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
const int Limit = 9;
 
int det(int *arr) {
    return
        + arr[0] * arr[4] * arr[8]
        + arr[2] * arr[3] * arr[7]
        + arr[1] * arr[5] * arr[6]
        - arr[2] * arr[4] * arr[6]
        - arr[1] * arr[3] * arr[8]
        - arr[0] * arr[5] * arr[7];
}
 
 
void find_max(int *work, int *res, int &det_max, int deep = 0) {
    if (deep >= Limit) {
        int d = det(work);
        d = d > 0 ? d : -d;
        if (d >= det_max) {
            det_max = d;
            for (int k = 0; k < Limit; ++k)
                res[k] = work[k];
 
            cout << det_max << endl;
            for (int i = 0; i < Limit; ++i) {
                cout << setw(2) << res[i];
            }
            cout << endl;
        }
    }
    bool next = false;
    for (int digit = 1; digit <= Limit; ++digit) {
        next = false;
        for (int j = 0; j < deep; ++j)
            if (work[j] == digit) {
                next = true;
                break;
            }
        if (next)
            continue;
        work[deep] = digit;
        find_max(work, res, det_max, deep + 1);
    }
}
 
int main()
{
    int work[Limit], res[Limit];
    int det_max = 0;
 
    find_max(work, res, det_max);
 
    cout << det_max << endl;
    for (int i = 0; i < Limit; ++i) {
        cout << setw(2) << res[i];
        if ((i + 1) % 3 == 0)
            cout << endl;
    }
}
Цитата Сообщение от lemegeton Посмотреть сообщение
В результате получил вот такую матрицу.
Аналогично.

Но решение не единственное.
Значение детерминанта 412 имеют матрицы в количестве 72 штук (одна строка - одна матрица 3х3)
Код
 1 4 8 5 9 3 7 2 6
 1 4 8 7 2 6 5 9 3
 1 5 7 4 9 2 8 3 6
 1 5 7 8 3 6 4 9 2
 1 7 5 4 2 9 8 6 3
 1 7 5 8 6 3 4 2 9
 1 8 4 5 3 9 7 6 2
 1 8 4 7 6 2 5 3 9
 2 4 9 6 8 3 7 1 5
 2 4 9 7 1 5 6 8 3
 2 6 7 4 8 1 9 3 5
 2 6 7 9 3 5 4 8 1
 2 7 6 4 1 8 9 5 3
 2 7 6 9 5 3 4 1 8
 2 9 4 6 3 8 7 5 1
 2 9 4 7 5 1 6 3 8
 3 5 9 6 7 2 8 1 4
 3 5 9 8 1 4 6 7 2
 3 6 8 5 7 1 9 2 4
 3 6 8 9 2 4 5 7 1
 3 8 6 5 1 7 9 4 2
 3 8 6 9 4 2 5 1 7
 3 9 5 6 2 7 8 4 1
 3 9 5 8 4 1 6 2 7
 4 1 8 2 7 6 9 5 3
 4 1 8 9 5 3 2 7 6
 4 2 9 1 7 5 8 6 3
 4 2 9 8 6 3 1 7 5
 4 8 1 2 6 7 9 3 5
 4 8 1 9 3 5 2 6 7
 4 9 2 1 5 7 8 3 6
 4 9 2 8 3 6 1 5 7
 5 1 7 3 8 6 9 4 2
 5 1 7 9 4 2 3 8 6
 5 3 9 1 8 4 7 6 2
 5 3 9 7 6 2 1 8 4
 5 7 1 3 6 8 9 2 4
 5 7 1 9 2 4 3 6 8
 5 9 3 1 4 8 7 2 6
 5 9 3 7 2 6 1 4 8
 6 2 7 3 9 5 8 4 1
 6 2 7 8 4 1 3 9 5
 6 3 8 2 9 4 7 5 1
 6 3 8 7 5 1 2 9 4
 6 7 2 3 5 9 8 1 4
 6 7 2 8 1 4 3 5 9
 6 8 3 2 4 9 7 1 5
 6 8 3 7 1 5 2 4 9
 7 1 5 2 4 9 6 8 3
 7 1 5 6 8 3 2 4 9
 7 2 6 1 4 8 5 9 3
 7 2 6 5 9 3 1 4 8
 7 5 1 2 9 4 6 3 8
 7 5 1 6 3 8 2 9 4
 7 6 2 1 8 4 5 3 9
 7 6 2 5 3 9 1 8 4
 8 1 4 3 5 9 6 7 2
 8 1 4 6 7 2 3 5 9
 8 3 6 1 5 7 4 9 2
 8 3 6 4 9 2 1 5 7
 8 4 1 3 9 5 6 2 7
 8 4 1 6 2 7 3 9 5
 8 6 3 1 7 5 4 2 9
 8 6 3 4 2 9 1 7 5
 9 2 4 3 6 8 5 7 1
 9 2 4 5 7 1 3 6 8
 9 3 5 2 6 7 4 8 1
 9 3 5 4 8 1 2 6 7
 9 4 2 3 8 6 5 1 7
 9 4 2 5 1 7 3 8 6
 9 5 3 2 7 6 4 1 8
 9 5 3 4 1 8 2 7 6
lemegeton, уточнение: перестановок всё-таки 362880‬ (9!), а не 134217728.
1
19.02.2020, 05:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2020, 05:10
Помогаю со студенческими работами здесь

Контейнеры с++
Ребят,подскажите пожалуйста,какую функцию нужно использовать,чтобы проверить массив на...

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

Контейнеры
Где можно про это прочитать? Т.е чтобы при увеличении окна компоненты тоже двигались?

Контейнеры Qt
Доброго времени суток. Возникла проблема - не могу выбрать подходящий контейнер. Опишу суть...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru