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

Удаление рядков и столбцов в матрице - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
09.12.2012, 04:54     Удаление рядков и столбцов в матрице #1
Есть матрица, нужно удалить те рядки и столбцы в которих есть нулевой елемент.

Например из матрицы
3 2 -3 0 4
4 0 2 -1 1
2 3 -1 -3 2

получаем

3 -3 4
2 -1 2

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

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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
main()
{
    int m,n;
    while(1)
    {
        printf("razmer matricy (MxN)");
        scanf("%d %d", &m, &n);
        if (m>0 && n>0) break;
        printf("PPF");
    }
 
    int matrix[m][n];
 
    srand ( time(NULL) );
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            matrix[i][j]=rand() % 10+(-5);
 
    for(int i=0; i<m; i++)
        {
            for(int j=0; j<n; j++)
                printf("%6d", matrix[i][j]);
            printf("\n");
        }
 
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            if (matrix[i][j]==0)
            {
                for(int k=0; k<n; k++)
                    matrix[k][j]=100;
                for(int k=0; k<m; k++)
                    matrix[i][k]=100;
            }
 
    printf("\n\n\n");
    for(int i=0; i<m; i++)
        {
            for(int j=0; j<n; j++)
                printf("%6d", matrix[i][j]);
            printf("\n");
        }
 
 
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.12.2012, 05:22     Удаление рядков и столбцов в матрице #2
Цитата Сообщение от Triall Посмотреть сообщение
Идея была записывать в ети рядки или столбки значение 100, а потом когда встречаем столбик или рядок в котором первый елемент 100, не записываем его.
Зачем что-то куда-то записывать, если у тебя уже есть признак - наличие нуля.
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
09.12.2012, 05:30  [ТС]     Удаление рядков и столбцов в матрице #3
Vourhey, Если матрица будет например такая:

1 2 3 2 1
1 0 2 0 1
1 2 3 3 2
1 3 2 1 3

То сначала найдется 0 на [2][2] и удалится 0 на [2][4] что приведет к неизменению 4 столбца.

Добавлено через 1 минуту
Цитата Сообщение от Vourhey Посмотреть сообщение
Зачем что-то куда-то записывать, если у тебя уже есть признак - наличие нуля.
Я не могу понять, как мне не записывать эти строки\столбцы... Я бы рад ничего не записывать, не никак не пойму как сделать по другому...
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.12.2012, 05:58     Удаление рядков и столбцов в матрице #4
Ты можешь их сохранять не в матрице, а отдельно от нее, индексы.
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
09.12.2012, 06:14  [ТС]     Удаление рядков и столбцов в матрице #5
Vourhey, можно какой то, хоть минимальный, пример кода?
mokojumbot
a.i.
139 / 139 / 12
Регистрация: 09.11.2012
Сообщений: 906
09.12.2012, 06:22     Удаление рядков и столбцов в матрице #6
Triall, вам же идею предложили: работайте с индексами.

Цитата Сообщение от Triall Посмотреть сообщение
3 2 -3 0 4
4 0 2 -1 1
2 3 -1 -3 2
у вас в примере в 1 строке 0 есть, почему не удалили строку?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.12.2012, 06:25     Удаление рядков и столбцов в матрице #7
Triall, ну ты просто можешь завести контейнер (вектор, или сет, например) и там сохранять индексы.
Цитата Сообщение от Triall Посмотреть сообщение
Vourhey, Если матрица будет например такая:
1 2 3 2 1
1 0 2 0 1
1 2 3 3 2
1 3 2 1 3
То сначала найдется 0 на [2][2] и удалится 0 на [2][4] что приведет к неизменению 4 столбца.
А ты, когда будешь переносить строку, то 0 оставь на месте. То есть при переносе тройки с третьей строки на вторую, ставишь просто 0. Это можно сделать, потому что этот столбец все равно будет удален и какое там было значение уже не важно. Для остальных нулей - то же самое. Должно сработать, я думаю.
mokojumbot
a.i.
139 / 139 / 12
Регистрация: 09.11.2012
Сообщений: 906
09.12.2012, 08:00     Удаление рядков и столбцов в матрице #8
Vourhey, так что ему сначала проверять/удалять в таком случае?
Код
0 1 2 0 3
1 2 4 5 6
0 1 0 0 0
5 4 5 2 1
если проверять/удалять сначала ряды:
Код
1 2 4 5 6
5 4 3 2 1
если сначала столбцы:
Код
1
2
1
4
результат работы разный..
либо я неверно понял условие?
поутру не соображаю, поправьте.

Добавлено через 1 час 13 минут
вы решите, что должно из чего получаться, чтобы знать, что писать)
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
09.12.2012, 08:01  [ТС]     Удаление рядков и столбцов в матрице #9
Цитата Сообщение от mokojumbot Посмотреть сообщение
либо я неверно понял условие?
Вы все верно поняли, нужно что бы все строки\столбцы удалились одновременно.
mokojumbot
a.i.
139 / 139 / 12
Регистрация: 09.11.2012
Сообщений: 906
09.12.2012, 08:03     Удаление рядков и столбцов в матрице #10
Цитата Сообщение от Triall Посмотреть сообщение
Вы все верно поняли, нужно что бы все строки\столбцы удалились одновременно.
из моего примера что получиться должно, нарисуйте :)
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
09.12.2012, 08:06  [ТС]     Удаление рядков и столбцов в матрице #11
mokojumbot,

0 1 2 0 3
1 2 4 5 6
0 1 0 0 0
5 4 5 2 1

2
4

Тоесть все строки\столбцы в которых есть 0 удаляются
mokojumbot
a.i.
139 / 139 / 12
Регистрация: 09.11.2012
Сообщений: 906
09.12.2012, 08:42     Удаление рядков и столбцов в матрице #12
мои догадки:

если в строке есть хотя-бы один 0, заполняем всю нулями

0 0 0 0 0
1 2 4 5 6
0 0 0 0 0
5 4 5 2 1
записываем в массив

если в столбце хотя-бы один ноль, заполняем нулями
0 1 0 0 0
0 2 0 0 0
0 1 0 0 0
0 4 0 0 0

потом сравниваем 2 получившихся массива. если значение [x][y] 1 массива == значению 2 на том-же месте, оставляем. Иначе удаляем.

.. поутру туго соображаю. подправьте, идею, я думаю, вы поняли :)
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
19.12.2012, 02:14  [ТС]     Удаление рядков и столбцов в матрице #13
Полный ступор... Ребята, помогите пожалуйста.

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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
main ()
{
    int n;
    while (1)
    {
        cout << "vvedit rozmir matrytsi ( ne bilshe 20 )";
        cin >> n;
        if (n>1 && n<20) break;
        cout << "PPV!";
    }
 
    int matrix[n][n];
 
    srand ( time(NULL) );
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            matrix[i][j]=rand() % 10;
 
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n; j++)
            cout << matrix[i][j] << "  ";
        cout << "\n\n";
    }
 
    int matri[n], matrj[n], k=0;
 
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            if (matrix[i][j]==0)
                {
                    matri[k]=i;
                    matrj[k]=j;
                    k++;
                }
 
    for (int i=0;i<k;i++)
        cout << matri[i] << " " << matrj[i] << "   ";
 
}
Дальше нифига не погу нормального придумать...

Добавлено через 6 часов 11 минут
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
main ()
{
    int  k=0, n;
    while (1)
    {
        cout << "vvedit rozmir matrytsi ( ne bilshe 20 )";
        cin >> n;
        if (n>1 && n<20) break;
        cout << "PPV!";
    }
 
    int **matrix=new int* [n], matri[n*n], matrj[n*n];
 
    srand ( time(NULL) );
    for (int i=0; i<n; i++)
    {
        matrix[i]=new int[n];
        for (int j=0; j<n; j++)
        {
            matrix[i][j]=rand() % 10;
            cout << matrix[i][j] <<"  ";
            if (matrix[i][j]==0)
                {
                    matri[k]=i;
                    matrj[k]=j;
                    k++;
                }
        }
        cout << endl;
    }
 
    for (int i=0;i<k;i++)
        cout << "[" << matri[i]+1 << ";" << matrj[i]+1 << "]   ";
    cout << endl;
 
 
    for (int p=0; p<k; p++)
    {
        for (int i=0;i<n;i++)
            for (int j=matrj[p];j<n-1;j++)
                matrix[i][j]=matrix[i][j+1];
        delete [] matrix[matri[p]];
        for (int i=matri[p];i<n-1;i++)
            matrix[i]=matrix[i+1];
    }
 
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n-1; j++)
            cout << matrix[i][j] << "  ";
        cout << "\n\n";
    }
}
Уже почти работает... Но все равно, что то не так. Кто то может подсказать ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 00:25     Удаление рядков и столбцов в матрице
Еще ссылки по теме:

Задача с перестановкой столбцов в матрице C++
C++ Перестановка строк и столбцов в матрице
Сформировать массив натуральных чисел с M рядков и столбцов C++

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

Или воспользуйтесь поиском по форуму:
Triall
 Аватар для Triall
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 68
10.01.2013, 00:25  [ТС]     Удаление рядков и столбцов в матрице #14
Опять начал решать... Оказалось что вв прошлый раз чуток протупил
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
main ()
{
    int  k=0, n;
    while (1)
    {
        cout << "vvedit rozmir matrytsi ( ne bilshe 20 )";
        cin >> n;
        if (n>1 && n<20) break;
        cout << "PPV!";
    }
 
    int **matrix=new int* [n], matri[n*n], matrj[n*n];
 
    srand ( time(NULL) );
    for (int i=0; i<n; i++)
    {
        matrix[i]=new int[n];
        for (int j=0; j<n; j++)
        {
            matrix[i][j]=rand() % 10;
            cout << matrix[i][j] <<"  ";
            if (matrix[i][j]==0)
                {
                    matri[k]=i;
                    matrj[k]=j;
                    k++;
                }
        }
        cout << endl;
    }
 
    for (int i=0;i<k;i++)
        cout << "[" << matri[i]+1 << ";" << matrj[i]+1 << "]   ";
    cout << endl;
 
 
    for (int p=0; p<k; p++)
    {
        for (int i=0;i<n;i++)
            for (int j=matrj[p];j<n-1;j++)
                matrix[i][j]=matrix[i][j+1];
        delete [] matrix[matri[p]];
        for (int i=matri[p];i<n-1;i++)
            matrix[i]=matrix[i+1];
    }
 
    for (int i=0; i<n-k; i++)
    {
        for (int j=0; j<n-k; j++)
            cout << matrix[i][j] << "  ";
        cout << "\n\n";
    }
}
Yandex
Объявления
10.01.2013, 00:25     Удаление рядков и столбцов в матрице
Ответ Создать тему
Опции темы

Текущее время: 23:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru