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

Сортировка двухмерного массива по i и j - C++

Восстановить пароль Регистрация
 
razer89
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142
12.11.2011, 01:50     Сортировка двухмерного массива по i и j #1
Нужно написать алгоритм, который создавал бы массив чисел, при чем так, чтобы каждый последующий элемент (по i или по j) был меньше предыдущего. Т.е. matr[i][j] > matr[i][j + 1] и matr[i][j] > matr[i + 1][j]
Вот дословно условие задачи:
"Написать пограмму, которая в двухмерно массиве A(N,M) целых чисел, таком, что для всех I от 1 до N, J от 1 до M-1 выполняется A(I, J) > A(I, J+1) и для всех I от 1 до N-1 выполняется A(I, M) < A(I+1, M), находит все элементы A(I, J), равные J + I, или устанавливает, что таких элементов нет."
Перепробовал уже кучу способов, но в итоге прога либо уходит в бесконечный цикл, либо ОЧЕНЬ долго ищет элементы... Помогите, пожалуйста!

Добавлено через 16 минут
Забыл добавить - язык С
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
12.11.2011, 15:14     Сортировка двухмерного массива по i и j #2
Цитата Сообщение от razer89 Посмотреть сообщение
прога либо уходит в бесконечный цикл, либо ОЧЕНЬ долго ищет элементы
прогу в студию
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.11.2011, 15:24     Сортировка двухмерного массива по i и j #3
так вам создать или сортировать надо?
4 4 4 4
4 3 3 3
4 3 2 2
4 3 2 1
вот.

Добавлено через 1 минуту
Цитата Сообщение от razer89 Посмотреть сообщение
находит все элементы A(I, J), равные J + I, или устанавливает, что таких элементов нет.
а вот и задание.
razer89
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142
12.11.2011, 15:53  [ТС]     Сортировка двухмерного массива по i и j #4
OstapBender, создать отсортированный массив вида:

9 8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0 -1
6 5 4 3 2 1 0 -1 -2

Т.е. каждый следующий элемент (как в строке, так и в столбце) должен быть меньше предыдущего.

talis, special for you:
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
//---------------------------------------------------------------------------
 
#pragma hdrstop
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[]){
    int n, m, i, j, temp;
    unsigned long matr[25][25];
    puts ("Vvedite razmernost' matrici (i)");
    scanf ("%d", &n);
    puts ("Vvedite razmernost' matrici (j)");
    scanf ("%d", &m);
 
        for (i = 0; i < n; i++) {
            printf ("\n");
            for (j = 0; j < m; j++) {
                srand (time(0));
                if (i == 0) {
                    if (j == 0) {
                        matr[i][j] = rand()%1000;
                        printf (" %d", matr[i][j]);
                    }
                    else if (j > 0) {
                        temp = rand()%1000;
                        if (matr[i][j-1] > temp) {
                            matr[i][j] = temp;
                            printf (" %d", matr[i][j]);
                        }
                        else j--;
                    }
                }
 
            }
        }
    getchar ();
}
Данный код создает первые несколько элементов (к примеру, для матрицы 5*5 он вывел 334, 118, 40, 21, 1, и больше у него не осталось вариантов). Как оптимизировать код так, чтобы он выводил случайные числа из заданного промежутка?

Да, и еще появилась идейка. Допустим, размерность матрицы зададим 10*10. Значит в ней будет 100 элементов. А что, если создать обычный одномерный массив из случайных чисел, и потом уже на основе его заполнять матрицу (найти в массиве наибольший элемент -> поместить его в матрицу matr[0][0]; затем найти в массиве наибольший элемент, но меньше matr[0][0], и поместить его в matr[0][1] и т.д....). Получится ли реализовать такой алгоритм?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
12.11.2011, 16:15     Сортировка двухмерного массива по i и j #5
Так вы хотели?

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
#include <stdio.h>
 
#define AT(arr,r,c) (arr)[(r)*columns+(c)]
 
int main( )
{
    int * matrix;
    int rows = 0, columns = 0;
 
    while( rows < 1 )
    {
        printf( "rows: " );
        scanf( "%d", &rows );
 
        if( rows < 1 )
           puts( "rows count should be greater then one" );
    }
 
 
    while( columns < 1 )
    {
        printf( "columns: " );
        scanf( "%d", &columns );
 
        if( columns < 1 )
           puts( "columns count should be greater then one" );
    }
 
    printf( "creating %dx%d matrix...", rows, columns );
    matrix = malloc( rows * columns * sizeof( int )  );
 
    if( !matrix )
    {
        puts( " error" );
        return -1;
    }
 
    putchar( '\n' );
 
    // -- заполнение ----
 
    int _r, _c;
    for( _r = 0; _r < rows; _r++ )
    {
        for( _c = 0; _c < columns; _c++ )
            AT( matrix, _r, _c ) = columns - _c + rows - _r;
    }
 
    // -- вывод ----------
 
    for( _r = 0; _r < rows; _r++ )
    {
        for( _c = 0; _c < columns; _c++ )
            printf( "%3d ", AT( matrix, _r, _c ) );
 
        putchar( '\n' );
    }
 
    putchar( '\n' );
 
    // -- поиск элементов matrix[_r][_c] == _r + _c
 
    if( (_r + _c) & 1 )
        puts( "No elemets are expected." );
    else
        puts( "-- [i][j] == i + j: ----" );
 
    // проверяем предположение
    for( _r = 0; _r < rows; _r++ )
    {
        for( _c = 0; _c < columns; _c++ )
        {
            if( AT( matrix, _r, _c ) == _r + _c )
               printf( "(%3d, %3d) = %3d\n", _r, _c, _r + _c );
        }
    }
 
    putchar( '\n' );
 
 
    // -- завершение ----
 
    puts( "freeing matrix\n" );
    free( matrix );
 
 
    return 0;
}
razer89
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142
12.11.2011, 16:26  [ТС]     Сортировка двухмерного массива по i и j #6
Цитата Сообщение от talis Посмотреть сообщение
42: int _r, _c;
RAD Studio выдает ошибку при компилировании [BCC32 Error] File1.c(42): E2140 Declaration is not allowed here
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
12.11.2011, 16:27     Сортировка двухмерного массива по i и j #7
razer89, ну переместите их в начало функции. Педантичная у вас RAD Studio какая...
razer89
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142
12.11.2011, 16:33  [ТС]     Сортировка двухмерного массива по i и j #8
Цитата Сообщение от talis Посмотреть сообщение
razer89, ну переместите их в начало функции. Педантичная у вас RAD Studio какая...
ага, уже догадался. ну вроде работает. осталось только разобраться, как это оно работает...)) в частности, не понял что делает
C
1
    matrix = malloc( rows * columns * sizeof( int )  );
Огромное спасибо за помощь!
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
12.11.2011, 16:35     Сортировка двухмерного массива по i и j #9
malloc выделяет нужное количество памяти и сохраняет адрес начала выделенного блока в указателе matrix. В скобках - размер блока памяти в байтах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2011, 16:45     Сортировка двухмерного массива по i и j
Еще ссылки по теме:

C++ Из двухмерного массива в одномерный
Передача двухмерного массива в функцию C++
C++ Memset для двухмерного массива
Сортировка двухмерного массива вставками C++
C++ Сортировка двухмерного динамического массива

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

Или воспользуйтесь поиском по форуму:
razer89
15 / 15 / 0
Регистрация: 20.06.2010
Сообщений: 142
12.11.2011, 16:45  [ТС]     Сортировка двухмерного массива по i и j #10
Цитата Сообщение от talis Посмотреть сообщение
malloc выделяет нужное количество памяти и сохраняет адрес начала выделенного блока в указателе matrix. В скобках - размер блока памяти в байтах.
Мда... Я как самый начинающий новичек весьма отдаленно понимаю, что значат Ваши слова...) Ну чтож, учиться, учиться и еще раз учиться...
Yandex
Объявления
12.11.2011, 16:45     Сортировка двухмерного массива по i и j
Ответ Создать тему
Опции темы

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