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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.71
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
#1

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

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

Даны две матрицы одинаковых размеров. Определить, может ли при перестановке строк одной матрицы получится вторая. Помогите пожалуйста реализовать данную программу на Си, потому что сам я пока не могу сделать. Заранее всем спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2011, 17:07     Определить, может ли при перестановке строк одной матрицы получится вторая
Посмотрите здесь:
C++ Каким может быть максимальное число строк и столбцов матрицы
C++ Определить номера тех строк целочисленной матрицы A[N,K], которые совпадают с массивом D[K], если таких строк нет - выдать соответствующее сообщение
C++ Ошибка при вводе разного кол-ва строк и столбцов в матрицы. Динамич. матрицы/массивы
Сложить цифры числа (до тех пор, пока не получится сумма из одной цифры) C++
C++ По перестановке определить его номер в лексикографическом перечислении всех перестановок множества
Указатели: определить количество столбцов символьной матрицы, не содержащих ни одной буквы 'Q' C++
Вставка элементов одной последовательности в другую так, чтобы вторая последовательность осталась невозрастающей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.08.2011, 17:11     Определить, может ли при перестановке строк одной матрицы получится вторая #2
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
потому что сам я пока не могу сделать
почему? хоть какие-то нароботки есть?
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
15.08.2011, 17:28  [ТС]     Определить, может ли при перестановке строк одной матрицы получится вторая #3
я ток неделю изучаю Си. да я представляю что нужно построчно сравнивать матрицы. но как это реализовать не пойму.
LosAngeles
Заблокирован
15.08.2011, 17:30     Определить, может ли при перестановке строк одной матрицы получится вторая #4
куда ты торопишься, открой книжечку, почитай
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.08.2011, 17:35     Определить, может ли при перестановке строк одной матрицы получится вторая #5
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;
    }
}
LosAngeles
Заблокирован
15.08.2011, 17:39     Определить, может ли при перестановке строк одной матрицы получится вторая #6
break надо делать в таких случаях*
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.08.2011, 17:40     Определить, может ли при перестановке строк одной матрицы получится вторая #7
Цитата Сообщение от LosAngeles Посмотреть сообщение
break надо делать в таких случаях*
сдесь и флага достаточно
paskal
434 / 283 / 25
Регистрация: 15.08.2011
Сообщений: 839
15.08.2011, 17:41     Определить, может ли при перестановке строк одной матрицы получится вторая #8
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
Даны две матрицы одинаковых размеров. Определить, может ли при перестановке строк одной матрицы получится вторая. Помогите пожалуйста реализовать данную программу на Си, потому что сам я пока не могу сделать. Заранее всем спасибо.
Уточните известен ли размер и количество строк матриц.
LosAngeles
Заблокирован
15.08.2011, 17:41     Определить, может ли при перестановке строк одной матрицы получится вторая #9
без него быстрее
-=ЮрА=-
Заблокирован
Автор FAQ
15.08.2011, 17:48     Определить, может ли при перестановке строк одной матрицы получится вторая #10
Берём строку, сравниваем с каждой из строк 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";
}
Миниатюры
Определить, может ли при перестановке строк одной матрицы получится вторая  
-=ЮрА=-
Заблокирован
Автор FAQ
15.08.2011, 17:52     Определить, может ли при перестановке строк одной матрицы получится вторая #11
Цитата Сообщение от Maxwe11 Посмотреть сообщение
if (matr1[j][i] != matr2[i][j])
- чё за бред сравниваем элементы в строках и столбцах например для i = 2 j = 3
matr[2][3] != matr[3][2] -

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

456
123
789
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
15.08.2011, 18:00  [ТС]     Определить, может ли при перестановке строк одной матрицы получится вторая #15
смотрел, но он на С++ а мне надо на С, потому что С++ для меня темный лес.
paskal
434 / 283 / 25
Регистрация: 15.08.2011
Сообщений: 839
15.08.2011, 18:02     Определить, может ли при перестановке строк одной матрицы получится вторая #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Берём строку, сравниваем с каждой из строк 2-й матрицы, если есть такая же, переходим к другой строке, в итоге либо перебрав все строки 1-й матрицы поймём что они есть во 2-й либо какая та строка не будет содержаться - тогда матрицы не эквивалентны,
Это решение не полное. Во 2-й матрице могут попасться 2 одинаковые строки, тогда перестановки не существует, а ваш алгоритм скажет что существует.
Нужно создать вспомогательный одномерный массив, длина которого равна числу строк матриц. Перебирать поиском строки с 0-й по последнюю и если совпадение есть, записывать номер совпавшей строки во вспомогательный массив. Потом отсортировать его и проверить на последовательность 0,1,2...N-1. Если хоть раз совпадения не получилось, можно закончить с отрицательным ответом.
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
15.08.2011, 19:57     Определить, может ли при перестановке строк одной матрицы получится вторая #17
можно отсортировать сначала строки матрицы, а потом по-элементно сравнить:
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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
15.08.2011, 22:01     Определить, может ли при перестановке строк одной матрицы получится вторая #18
Цитата Сообщение от 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
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
15.08.2011, 22:33     Определить, может ли при перестановке строк одной матрицы получится вторая #19
-=ЮрА=-, а почему во всех случаях в выводе результат "matr1 not equal matr2"? Это так и должно быть?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2011, 08:28     Определить, может ли при перестановке строк одной матрицы получится вторая
Еще ссылки по теме:
Определить номера строк матрицы C++
C++ Определить номера строк матрицы
Программа не компилируется при перестановке прототипов шаблонных функций C++
C++ Нуэно посчитать сумму всех строк матрицы, у меня считает только сумму одной строки
Определить количество нулевых строк матрицы C++

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

Или воспользуйтесь поиском по форуму:
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
16.08.2011, 08:28     Определить, может ли при перестановке строк одной матрицы получится вторая #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот код на С...
C++
1
2
3
4
5
        matr1 = new int *[rows];
        matr2 = new int *[rows];
 
        delete [] matr1;
        delete [] matr2;
Когда это операторы new и delete стали входить в состав языка Си???
Yandex
Объявления
16.08.2011, 08:28     Определить, может ли при перестановке строк одной матрицы получится вторая
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru