Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 38

Определить, может ли при перестановке строк одной матрицы получится вторая

15.08.2011, 17:07. Показов 7034. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны две матрицы одинаковых размеров. Определить, может ли при перестановке строк одной матрицы получится вторая. Помогите пожалуйста реализовать данную программу на Си, потому что сам я пока не могу сделать. Заранее всем спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.08.2011, 17:07
Ответы с готовыми решениями:

Может ли получится список тождественный исходному при перемешивании методом random.shuffle()
Может ли при случайном перемешивании массива 1, 2, 3, 4, 5 при помощи метода random.shuffle() получиться массив 1, 2, 3, 4, 5? Нет, не...

Может ли при каких либо условиях вторая квадратичная форма равняться нулю?
может ли при каких либо условиях вторая квадратичная форма равняться нулю, если да то при каких условиях, и что это означает?

Определить, что получится при выполнении указанного кода
#include<stdio.h> #include<math.h> int x,z=1; int main(){ for(x=0; x<5;x++) { z++; if(x<3) continue; if(x>3) break; ...

21
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.08.2011, 17:11
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
потому что сам я пока не могу сделать
почему? хоть какие-то нароботки есть?
0
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 38
15.08.2011, 17:28  [ТС]
я ток неделю изучаю Си. да я представляю что нужно построчно сравнивать матрицы. но как это реализовать не пойму.
0
Заблокирован
15.08.2011, 17:30
куда ты торопишься, открой книжечку, почитай
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.08.2011, 17:35
C
1
2
3
4
5
6
7
8
9
10
11
12
int matr1[N][N] = {...},
    matr2[N][N] = {...};
//...
int i, j, equal = 1; //equal == 1 - matrix equal
for (i = 0; i < N && equal; ++i)
{
    for (j = 0; j < N && equal; ++j)
    {
        if (matr1[j][i] != matr2[i][j])
            equal = 0;
    }
}
0
Заблокирован
15.08.2011, 17:39
break надо делать в таких случаях*
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.08.2011, 17:40
Цитата Сообщение от LosAngeles Посмотреть сообщение
break надо делать в таких случаях*
сдесь и флага достаточно
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
15.08.2011, 17:41
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
Даны две матрицы одинаковых размеров. Определить, может ли при перестановке строк одной матрицы получится вторая. Помогите пожалуйста реализовать данную программу на Си, потому что сам я пока не могу сделать. Заранее всем спасибо.
Уточните известен ли размер и количество строк матриц.
0
Заблокирован
15.08.2011, 17:41
без него быстрее
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
15.08.2011, 17:48
Берём строку, сравниваем с каждой из строк 2-й матрицы, если есть такая же, переходим к другой строке, в итоге либо перебрав все строки 1-й матрицы поймём что они есть во 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
#include <iostream.h>
 
bool get_row(int rows, int cols, int ** matr, int * row);
void showrow(int cols, int *row);
 
int main()
{
    cout<<"Enter num of rows: ";
    int rows;cin>>rows;
    cout<<"Enter num of cols: ";
    int cols;cin>>cols;
 
    int ** matr1 = new int *[rows];
    int ** matr2 = new int *[rows];
 
    cout<<"Enter matrixes\r\n";
    for(int i = 0,j; i < rows; i++)
    {
        matr1[i] = new int[cols];
        matr2[i] = new int[cols];
        for(j = 0; j < cols; j++)
        {
            cout<<"matr1["<<i + 1<<"]["<<j + 1<<"] = ";
            cin>>matr1[i][j];
            cout<<"matr2["<<i + 1<<"]["<<j + 1<<"] = ";
            cin>>matr2[i][j];
        }
    }
    bool is_row = false;
    cout<<"\tmatr1\r\n";
    for(i = 0; i < rows; i++)
        showrow(cols, matr1[i]);
    cout<<"\tmatr2\r\n";
    for(i = 0; i < rows; i++)
        showrow(cols, matr2[i]);
    for(i = 0; i < rows; i++)
    {
        if(!(is_row = get_row(rows, cols, matr1, matr2[i])))
            break;
    }
    if(is_row && i == rows)
        cout<<"rows in matr2 is can be sorted in rows of matr1";
    else
        cout<<"matr1 not equal matr2\r\n";
    cout<<"Press any key to continue\r\n";
    char ch;cin>>ch;
    return 0;
}
 
bool get_row(int rows, int cols, int ** matr, int * row)
{
    bool ret = false;
    for(int i = 0,j, n; i < rows; i++)
    {
        n = 0;
        for(j = 0; j < cols; j++)
        {
            if(matr[i][j] == row[j])
                n++;
            else
                break;
        }
        if(n == cols)
            ret = true;
        if(ret)
            break;
    }
    return ret;
}
 
void showrow(int cols, int *row)
{
    for(int j = 0; j < cols; j++)
        cout<<row[j]<<" ";
    cout<<"\r\n";
}
Миниатюры
Определить, может ли при перестановке строк одной матрицы получится вторая  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
15.08.2011, 17:52
Цитата Сообщение от Maxwe11 Посмотреть сообщение
if (matr1[j][i] != matr2[i][j])
- чё за бред сравниваем элементы в строках и столбцах например для i = 2 j = 3
matr[2][3] != matr[3][2] -

Добавлено через 2 минуты
Maxwe11, обрати внимание
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
Определить, может ли при перестановке строк одной матрицы получится вторая.
- если перестановка строк, значит порядок элементов в них должен быть одинаков, нужно рассмотреть лишь вхождения этих строк в матрице для анализа
0
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 38
15.08.2011, 17:53  [ТС]
размеры могут вводиться как с клавиатуры так и быть константами.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.08.2011, 17:55
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- чё за бред сравниваем элементы в строках и столбцах например для i = 2 j = 3
matr[2][3] != matr[3][2] -
угу) мне чего-то транспонирование стукнуло в голову
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
15.08.2011, 17:57
Дмитрий, ты мой код смотрел?
Определить, может ли при перестановке строк одной матрицы получится вторая
Программа отработала и для варианта матриц
123
456
789

456
123
789
1
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 38
15.08.2011, 18:00  [ТС]
смотрел, но он на С++ а мне надо на С, потому что С++ для меня темный лес.
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
15.08.2011, 18:02
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Берём строку, сравниваем с каждой из строк 2-й матрицы, если есть такая же, переходим к другой строке, в итоге либо перебрав все строки 1-й матрицы поймём что они есть во 2-й либо какая та строка не будет содержаться - тогда матрицы не эквивалентны,
Это решение не полное. Во 2-й матрице могут попасться 2 одинаковые строки, тогда перестановки не существует, а ваш алгоритм скажет что существует.
Нужно создать вспомогательный одномерный массив, длина которого равна числу строк матриц. Перебирать поиском строки с 0-й по последнюю и если совпадение есть, записывать номер совпавшей строки во вспомогательный массив. Потом отсортировать его и проверить на последовательность 0,1,2...N-1. Если хоть раз совпадения не получилось, можно закончить с отрицательным ответом.
1
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
15.08.2011, 19:57
можно отсортировать сначала строки матрицы, а потом по-элементно сравнить:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
 
using namespace std;
 
/****************************
 Даны две матрицы одинаковых размеров.
 Определить, может ли при перестановке строк одной матрицы получится вторая
****************************/
 
 
 
 
const size_t SIZE = 3;
 
int** CreateMatrix(size_t nRow, size_t nCol)
{
    int** matrix = new int*[nRow];
    for (int i = 0; i < nRow; ++i)
    {
        matrix[i] = new int[nCol];
    }
 
    return matrix;
}
 
 
void ShowMatrix(int** matrix, size_t nRow, size_t nCol)
{
    for (int i = 0; i < nRow; ++i)
    {
        for (int j = 0; j < nCol; ++j)
        {
            cout << matrix[i][j] << "  ";
        }
        cout << endl;
    }
}
 
 
void InitMatrix(int** matrix, size_t nRow, size_t nCol)
{
    for (int i = 0; i < nRow; ++i)
        for (int j = 0; j < nCol; ++j)
            matrix[i][j] = 0;
}
 
 
void SwapPtr(int*& p1, int*& p2)
{
    int* tmp = p1;
    p1 = p2;
    p2 = tmp;
}
 
 
void SortRowsMatrix(int** matrix, size_t size)
{
    for (int i = 0; i < size; ++i)
    {
        for (int j = size-1; j > i; --j)
        {
            if (*matrix[j-1] > *matrix[j])
            {
                SwapPtr(matrix[j-1] , matrix[j]);
            }
        }
    }
}
 
 
bool IsEqual(int** matrix1, int** matrix2, size_t nRow, size_t nCol )
{
    for (int i = 0; i < nRow; ++i)
    {
        for (int j = 0; j < nCol; ++j)
        {
            if (matrix1[i][j] != matrix2[i][j])
                return false;
        }
    }
    return true;
}
 
 
int main()
{
    int** matrix = CreateMatrix(SIZE, SIZE);
    InitMatrix(matrix, SIZE, SIZE);
 
    matrix[0][0] = 600;
    matrix[0][1] = 2;
    matrix[0][2] = 3;
 
    matrix[1][0] = 8;
    matrix[1][1] = 7;
    matrix[1][2] = 6;
 
    matrix[2][0] = 345;
    matrix[2][1] = 78;
    matrix[2][2] = 23;
 
    SortRowsMatrix(matrix, SIZE);
    ShowMatrix(matrix, SIZE, SIZE);
 
    ////////////////////////////////////////////
    cout << endl;
    ////////////////////////////////////////////
 
    int** matrix2 = CreateMatrix(SIZE, SIZE);
    InitMatrix(matrix2, SIZE, SIZE);
 
    matrix2[0][0] = 345;
    matrix2[0][1] = 78;
    matrix2[0][2] = 23;
 
    matrix2[1][0] = 600;
    matrix2[1][1] = 2;
    matrix2[1][2] = 3;
 
    matrix2[2][0] = 8;
    matrix2[2][1] = 7;
    matrix2[2][2] = 6;
 
    ShowMatrix(matrix2, SIZE, SIZE);
 
    cout << endl;
 
 
    SortRowsMatrix(matrix2, SIZE);
    ShowMatrix(matrix2, SIZE, SIZE);
 
 
    IsEqual(matrix, matrix2, SIZE, SIZE) ? (cout << "Equal") : (cout << "NotEqual");
 
  //delete all matrix
 
 
    return 0;
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
15.08.2011, 22:01
Цитата Сообщение от PointsEqual Посмотреть сообщение
можно отсортировать сначала строки матрицы, а потом по-элементно сравнить:
- которыйраз встрчаю сортировки - они удлинняют время выполнения алгоритма, на мой взгляд нужно работать сразу с матрицами, притом есть ряд задач где исходная матрица должна оставаться таковой (даже если она не отсортированная)!

Добавлено через 2 минуты
Цитата Сообщение от paskal Посмотреть сообщение
Это решение не полное. Во 2-й матрице могут попасться 2 одинаковые строки, тогда перестановки не существует, а ваш алгоритм скажет что существует.
- С учётом этого изменил в своём алгоритме всего 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
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
#include <stdio.h>
#include <conio.h>
 
void getmatr(int rows, int cols, int ** matr, char * name); 
bool scanrow(int rows, int cols, int ** matr, int * row);
void showrow(int cols, int *row);
 
int main()
{
    int rows, cols;
    int ** matr1, **matr2;
    bool is_row = false;
    char ch;
    do
    {
        printf("Enter num of rows: ");
        scanf("%d",&rows);
        printf("Enter num of cols: ");
        scanf("%d",&cols);
 
        matr1 = new int *[rows];
        matr2 = new int *[rows];
 
        for(int i = 0; i < rows; i++)
        {
            matr1[i] = new int[cols];
            matr2[i] = new int[cols];
        }
        printf("Enter matrix A\r\n");
        getmatr(rows, cols, matr1, "A");
 
        printf("Enter matrix B\r\n");
        getmatr(rows, cols, matr2, "B");
    
        printf("\tMatrix A\r\n");
        for(i = 0; i < rows; i++)
            showrow(cols, matr1[i]);
        printf("\tMatrix B\r\n");
        for(i = 0; i < rows; i++)
            showrow(cols, matr2[i]);
        for(i = 0; i < rows; i++)
        {
            if(!(is_row = scanrow(rows, cols, matr1, matr2[i])))
                break;
        }
        delete [] matr1;
        delete [] matr2;
 
        if(is_row && i == rows)
            printf("rows in matr2 is can be sorted in rows of matr1\r\n");
        else
            printf("matr1 not equal matr2\r\n");
        printf("[Y/N] Y - enter new matrixes\r\n");
        ch = getch();
    }
    while('Y' == ch || 'y' == ch);
    return 0;
}
 
void getmatr(int rows, int cols, int ** matr, char * name)
{
    for(int i = 0,j; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
        {
            printf("%s[%02d][%02d] = ",name,i + 1, j + 1);
            scanf("%d",&matr[i][j]);
        }
    }
}
 
bool scanrow(int rows, int cols, int ** matr, int * row)
{
    bool ret = false;
    for(int i = 0,j, n; i < rows; i++)
    {
        n = 0;
        for(j = 0; j < cols; j++)
        {
            if(matr[i][j] == row[j])
                n++;
            else
                break;
        }
        if(cols < n)
            break;
    }
    if(n == cols)
        ret = true;
    return ret;
}
 
void showrow(int cols, int *row)
{
    for(int j = 0; j < cols; j++)
        printf("%d ",row[j]);
    printf("\r\n");
}
Листинг выполнения программы рассмотрел все случаи присутствия нескольких одинаковых строк)

Enter num of rows: 3
Enter num of cols: 3
Enter matrix A
A[01][01] = 1
A[01][02] = 2
A[01][03] = 3
A[02][01] = 4
A[02][02] = 5
A[02][03] = 6
A[03][01] = 7
A[03][02] = 8
A[03][03] = 9
Enter matrix B
B[01][01] = 4
B[01][02] = 5
B[01][03] = 6
B[02][01] = 7
B[02][02] = 8
B[02][03] = 9
B[03][01] = 1
B[03][02] = 2
B[03][03] = 3
Matrix A
1 2 3
4 5 6
7 8 9
Matrix B
4 5 6
7 8 9
1 2 3
matr1 not equal matr2
[Y/N] Y - enter new matrixes
Enter num of rows: 3
Enter num of cols: 3
Enter matrix A
A[01][01] = 1
A[01][02] = 2
A[01][03] = 3
A[02][01] = 1
A[02][02] = 2
A[02][03] = 3
A[03][01] = 4
A[03][02] = 5
A[03][03] = 6
Enter matrix B
B[01][01] = 4
B[01][02] = 5
B[01][03] = 6
B[02][01] = 1
B[02][02] = 2
B[02][03] = 3
B[03][01] = 7
B[03][02] = 8
B[03][03] = 9
Matrix A
1 2 3
1 2 3
4 5 6
Matrix B
4 5 6
1 2 3
7 8 9
matr1 not equal matr2
[Y/N] Y - enter new matrixes
Enter num of rows: 3
Enter num of cols: 3
Enter matrix A
A[01][01] = 1
A[01][02] = 2
A[01][03] = 3
A[02][01] = 1
A[02][02] = 2
A[02][03] = 3
A[03][01] = 4
A[03][02] = 5
A[03][03] = 6
Enter matrix B
B[01][01] = 1
B[01][02] = 2
B[01][03] = 3
B[02][01] = 1
B[02][02] = 2
B[02][03] = 3
B[03][01] = 4
B[03][02] = 5
B[03][03] = 6
Matrix A
1 2 3
1 2 3
4 5 6
Matrix B
1 2 3
1 2 3
4 5 6
matr1 not equal matr2
[Y/N] Y - enter new matrixes
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
15.08.2011, 22:33
-=ЮрА=-, а почему во всех случаях в выводе результат "matr1 not equal matr2"? Это так и должно быть?
0
 Аватар для Olga_
848 / 190 / 18
Регистрация: 01.08.2011
Сообщений: 505
16.08.2011, 08:28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот код на С...
C++
1
2
3
4
5
        matr1 = new int *[rows];
        matr2 = new int *[rows];
 
        delete [] matr1;
        delete [] matr2;
Когда это операторы new и delete стали входить в состав языка Си???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2011, 08:28
Помогаю со студенческими работами здесь

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

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

Сколько строк может хранить в одной таблице SQL Server?
Сколько строк может хранить в одной таблице SQL Server 2017 на базе SSMS 2017? Имеется 10 таблиц к примеру, и сколько строк может быть в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru