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

Создать уникальный двумерный массив - C++

Восстановить пароль Регистрация
 
Flinky
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 2
27.11.2013, 00:06     Создать уникальный двумерный массив #1
Пишу программку,которая находит в двумерном массиве(8*8) макс и мин значения.После чего создает прямоугольную область(фотка в конце),ограниченную минимальным и
максимальным значениями(само собой разумеется,что значения элементов массива должны быть уникальными,ибо минимальных допустим может быть несколько
(пять нулей)ну по крайней мере мне так кажется ).В итоге образуется новый массив,уже в котором надо выполнить сквозную сортировку по строкам.


Начал с самого начала


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
#include <iostream>
#include <ctime>
#include <stdio.h>
 
using namespace std;
 
int main()
{
 //   int z,x;
    int min =0;
    int max =0;
    srand(time(NULL));
    const int n = 8; 
    int sum = 0;
    int **a = new int* [n]; // Создаем массив указателей
    for (int i = 0; i < n; i++)
    {
        a[i] = new int [n]; // Создаем элементы
    }
    for (int i = 0; i <n && (i-1) != i; i++)
    {
        for (int j = 0; j < n && (j-1) != j; j++)
        {
            a[i][j] = rand() % 64;
            cout << a[i][j] << " "; 
        }
        cout << endl;
    }
    // Считаем минимальный и максимальный
    min = a[0][0];// берем самый первый элемент массива и считаем, что он минимальный.
    max = a[0][0];// и он же максимальный. 
 
 
//Вот именно тут я пытался сделать уникальность,проверка,чтоб предыдущий элемент не был равен последующему,вот она и не работает.
Думаю не обойтись без дополнительных циклов(так,дай подумать!или опять же разложить массив в одномерный размером в 8*8=64),но не могу понять как это обработать. 
    for (int i = 0; i < n && i != (i+1); i++)
    {
        for (int j = 0; j < n && j != (j+1); j++)
        {
            if (a[i][j] < min) min = a[i][j];
            //{
            //z=i;x=j;
        //  }
            if (a[i][j] > max) max = a[i][j];
        }
    }
    //cout << "z="<<z<<endl<<"  x="<<x<<endl;
    cout << "min = " << min << endl << "max = " << max << endl;
    // Удаление массива
    for (int i = 0; i < n; i++)
    {
        delete[]a[i]; 
    }
    delete [] a; 
    system("pause");
    return 0;
}
Дальше найду индексы мин и макс значений в массиве,определю размерность нового "прямоугольного" масива(на фотке обозначено как e и q),создам одномерный массив из (q*e)элементов,разложу туда получившийся
"прямоугольник" по строкам.В этом одномерном массиве уже отсортирую элементы(по возрастанию) и занесу обратно в "прямоугольник.

//мой прямоугольник
int *arr[e*q]=new int; // одномерный массив
...
for (int i=0;i<e;i++)
for (int j=0;j<q;j++);
arr[i*q+j]=mass[i][j];//Тут подкоментирую.Первый элемент у нас с индексами i j [0][0] (заносим их в первый элемент одномерного массива arr[0*0+0] ) так же с элементом [0][1],[0][2]...[5][4],как-то так
ладно,пока это только теория.

А пока надо сделать первоначальный массив(который 8*8) уникальным,может у кого есть догадки с этим?
Прикладываю фотку,моих "рассуждений"

https://pp.vk.me/c408519/v408519363/...NSQPRQu6ks.jpg
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2013, 00:06     Создать уникальный двумерный массив
Посмотрите здесь:

C++ Можно ли на основе vector'а создать двумерный массив
C++ Создать двумерный массив с фиксированными числами
Можно ли создать символьный двумерный массив char ? C++
Как создать двумерный динамический массив C++
C++ Создать и вывести двумерный массив
C++ Как можно создать зубчатый двумерный массив?
C++ MALLOC Создать двумерный массив структур
Создать двумерный массив и подсчитать C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
27.11.2013, 01:14     Создать уникальный двумерный массив #2
Flinky, ну например
C++
1
2
3
4
5
6
bool unik = true;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
for (int k = 0; k < 8; k++)
for (int m = 0; m < 8; m++)
if ((i != k || j != m) && a[i][j] == b[k][m]) unik = false;
Возможно грубоватое решение, но работает
Flinky
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 2
02.12.2013, 18:19  [ТС]     Создать уникальный двумерный массив #3
Почти доделал,для случая когда в первоначальном массиве(который 8*8) минимальный элемент стоит левее максимального,если учитывать по строке.
Создал новый массив(прямоугольник),перевел его в одномерный массив,отсортировал пузырьком,теперь надо из этого одномерного массиве снова образовать прямоугольник,должно быть похоже на развертку(только наоборот),подскажите как это можно сделать
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
#include <iostream>
#include <ctime>
 
using namespace std;
 
int main()
{
    int min =0;
    int max =0;
    int imin =-1; 
    int jmin =-1;
    int imax =-1; 
    int jmax =-1;   
    srand(time(NULL));
    const int n =8; 
    int sum = 0;
    int **a = new int* [n]; // Создаем массив указателей
    for (int i = 0; i < n; i++)
    { 
        a[i] = new int [n]; // Создаем элементы
    }
    // А дальше работа как с обычным массивом. 
    for (int i = 0;( i < n) && (i!= (i+1)); i++)
    {
        for (int j = 0;( j < n) && (i!= (i+1)); j++)
        {
            a[i][j] = rand() % 64;
            cout.width(3);
            cout << a[i][j] << " "; 
        }
        cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли
    }
    // Считаем минимальный и максимальный
    min = a[0][0];// берем самый первый элемент массива и считаем, что он минимальный.
    max = a[0][0];// и он же максимальный. 
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (a[i][j] < min)
                {
                min = a[i][j];
                    imin = i;
                        jmin = j;
            }
 
            if (a[i][j] > max)
            {   
                max = a[i][j];
                    imax = i;
                        jmax = j;
            }
        }
    }
  cout << "min = " << min << " pos = " << imin << " " << jmin  << endl << "max = " << max << " pos = " << imax << " " << jmax<< endl;
  //тут мы найдем e и q,размер прямоугольника,e-столбец,q-строка
  int e=abs( n-(n-abs((imax-imin))));
    cout <<"e ="<<e<<endl;
        int q = abs (n-(n-abs((jmax-jmin))));
            cout <<"q ="<<q<<endl;
//создадим новый массив(прямоугольник)
int **arr= new int *[e];
    
    for (int i=0; i<e; i++)
        arr[i] = new int[q];
//если минимальный стоит левее максимального(как я рисовал)
    //новый двумерный массив(прямоугольник) по каждой строке,поочередно,вписываем в одномерный
int k = 0;
for (i=imin; i<imax; i++)
    {
            int f = 0;
        for (j=jmin; j<jmax; j++)
        {
            arr[k*q + f] = a[i][j]; 
 
            f += 1;//f отвечает за передвижение по строке(вправо)
        }
        k += 1;//  k - за передвижение по столбцу(вниз)
}
 
    
for (int i=0; i<(e*q); i++)//внешний цикл,прогоняем от начала до конца(размер прямоугольника,разложенного в строку e*q)
    {
        for (int j = (e*q-1); j>i; j--)//ну и рассматриваем элементы с конца до позиции i;
        {
            if(arr[j]<arr[j-1] //// Если соседние элементы расположены в неправильном порядке, то меняем их местами
            {
                swap (a[j], a[j - 1]);//меняем их
            }
        }
} 
 
 
 
 
for (int i = 0; i < size(e*q); i++)
         {
        cout << arr[i] << ' ';
    }
    for (int i = 0; i < (e*q); i++)
   {
       delete[]arr[i];
    }
    delete [] arr;
 
 
        // Удаление массива
   for (int i = 0; i < n; i++)
   {
       delete[]a[i]; // Удаляем каждый элемент
   }
    delete [] a; // А потом массив
   system("pause");
    return 0;
}
Yandex
Объявления
02.12.2013, 18:19     Создать уникальный двумерный массив
Ответ Создать тему
Опции темы

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