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

Перестановкой строк и столбцов получить все возможные варианты матрицы

05.11.2014, 19:44. Показов 2371. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача в следующем. Имеется матрица произвольного n на m. Необходимо перестановкой строк и столбцов получить все возможные варианты этой матрицы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2014, 19:44
Ответы с готовыми решениями:

Получить все возможные варианты загрузки ящиков
На перевозку 800 кг овощей с базы подготовлены ящики. В них можно загрузить по 8, 10 и 15...

Получить все возможные варианты комплектов книг. Исправить код
#include<iostream.h> using namespace std; int main() { int i=0, j=0, k=0, m=0;...

Перестановкой строк и столбцов матрицы переместить максимальный элемент в верхний левый угол
Переставляя строки и столбцы матрицы добиться того, чтобы наибольший элемент (один из них) оказался...

Получить все возможные варианты комплектов из 60 книг, если посылки комплектуются по 10, 15 и 20 книг (поиск ошибки)
#include<iostream> using namespace std; int main() { int i=0, j=0, k=0, m=0; do { do...

5
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 120
05.11.2014, 19:51 2
Берешь первый элемент и меняешь местами со всеми другими элементами. Потом берешь второй элемент и меняешь местами со всеми, кроме 1. Далее берешь второй элемент и меняешь местами со всеми, кроме 1 и 2. И т.д.
0
4 / 4 / 3
Регистрация: 05.08.2012
Сообщений: 135
05.11.2014, 20:09  [ТС] 3
Так получатся не все возможные варианты. К тому же очень важно достичь этого именно перестановкой строк и столбцов.
0
30 / 30 / 35
Регистрация: 05.11.2014
Сообщений: 120
05.11.2014, 21:15 4
Позабыл об этом, пока размышлял над решением данной задачи. В голову приходит такой вариант: Предположим есть матрица 5*5. Берем 1-ю строку, меняем ее местами со всеми остальными. То же проделываем со 2-ой строкой, 3-й и т.д. После, меняем 1-й столбец со 2-м и проделываем предыдущий "фокус" со строками.Далее 1-й с 3-м и снова меняем все строки. И так до тех пор, пока все столбцы не побывают на местах друг друга. Есть несколько ссылочек, по этой теме: http://algolist.ru/maths/combinat/permutations.php
http://www.dmtsoft.ru/bn/334/as/oneaticleshablon/
0
4 / 4 / 3
Регистрация: 05.08.2012
Сообщений: 135
11.11.2014, 00:24  [ТС] 5
Это все немного не то
Эти алгоритмы заточены на работу с числами. Мне нужно комбинировать именно элементы, а не их значения.
0
343 / 343 / 331
Регистрация: 02.10.2014
Сообщений: 666
11.11.2014, 07:47 6
Перестановка без повторений
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
#include <iostream>
 
using namespace std;
 
int my_permutation(int a[], int n, int k){
    //âûäàåò k-þ ïåðåñòàíîâêó áåç ïîâòîðåíèé, âñåãî n! øòóê
    
    int fact = 1;
    for (int i = 2; i <= n; ++i)
        fact *= i;
        
    int p;
    if (k >= fact || k < 0)
        p = 0;
    else
        p = 1;
    
    int temp[n];
    for (int i = 0; i < n; ++i)
        temp[i] = i;
    
    for (int i = 0; i < n - 1; ++i){
        fact /= (n - i);
        a[i] = temp[k / fact];
        
        //óäàëÿþ èç temp ýëåìåíò ñäâèãîì îñòàëüíûõ ýë-â âïåðåä
        for (int j = k / fact; j < n - i - 1; ++j)
            temp[j] = temp[j + 1];
        
        k = k % fact;
    }
    
    a[n - 1] = temp[0];
    
    return p;
}
 
int main(){
    
    int a[4];
    for (int i = 0; i < 4 * 3 * 2; ++i){
        my_permutation(a, 4, i);
        for (int j = 0; j < 4; ++j)
            cout << a[j] << ' ';
        cout << endl;
    }   
}


Добавлено через 35 минут
решение задачи
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int my_permutation(int a[], int n, int k){
    //âûäàåò k-þ ïåðåñòàíîâêó áåç ïîâòîðåíèé, âñåãî n! øòóê
    
    int fact = 1;
    for (int i = 2; i <= n; ++i)
        fact *= i;
        
    int p;
    if (k >= fact || k < 0)
        p = 0;
    else
        p = 1;
    
    int temp[n];
    for (int i = 0; i < n; ++i)
        temp[i] = i;
    
    for (int i = 0; i < n - 1; ++i){
        fact /= (n - i);
        a[i] = temp[k / fact];
        
        //óäàëÿþ èç temp ýëåìåíò ñäâèãîì îñòàëüíûõ ýë-â âïåðåä
        for (int j = k / fact; j < n - i - 1; ++j)
            temp[j] = temp[j + 1];
        
        k = k % fact;
    }
    
    a[n - 1] = temp[0];
    
    return p;
}
 
int main(){
    
    int n, m;
    cin >> n >> m;
    
    cout << "-----------------------------------------" << endl;
    int matrix[10][10];
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            matrix[i][j] = i * m + j;
            cout << setw(3) << matrix[i][j];
        }
        cout << endl;
    }
    cout << "-----------------------------------------" << endl;
    cout << "-----------------------------------------" << endl;
        
    int f_n = 1;
    for (int i = 2; i <= n; ++i)
        f_n *= i;
        
    int f_m = 1;
    for (int i = 2; i <= m; ++i)
        f_m *= i;
        
    for (int i = 0; i < f_n; ++i){
        int a[n];
        my_permutation(a, n, i);
        for (int j = 0; j < f_m; ++j){
            int b[m];
            my_permutation(b, m, j);
            
            for (int i1 = 0; i1 < n; ++i1){
                for (int j1 = 0; j1 < m; ++j1)
                    cout << setw(3) << matrix[a[i1]][b[j1]];
                cout << endl;
            }
            cout << "-----------------------------------------" << endl;
        }       
    }       
}
0
11.11.2014, 07:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2014, 07:47
Помогаю со студенческими работами здесь

В магазине для пересылки по почте подготовлено 60 книг. Посылки комплектующих по 10, 15 и 20 книг. Получить все возможные варианты комплектов
написать 3 программы, используя все виды цикла(вайл, ду вайл, фор) В магазине для пересылки по...

Вывести все возможные варианты перестановок от 1 до n
Здравствуйте, у меня есть массив чисел от 1 до n, нужно чтобы выводились все возможные варианты...

Вывести все возможные варианты разреза трубы
Вводится длина трубы, количество заготовок (1, 2, 3, 4 ил 5), которые можно вырезать из трубы, и...

Все возможные варианты перестановки символов строки
Дана строка s, состоящая из n символ (n меньше 6) составить все возможные варианты перестановки...


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

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