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

Перемешивание двухмерного массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
Stenl1
1 / 1 / 0
Регистрация: 01.12.2009
Сообщений: 233
22.06.2011, 19:47     Перемешивание двухмерного массива #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
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{   
    int card =1;
    int deck[4][13]; //private
 
    for(int row = 0; row <= 3; row++)
    {
        
         for(int column = 0; column <= 12; column++)
        {
            deck[row][column] = card;
            card++;
        }
    }
/**********************************/
 //Вывод массива по правильном порядке
          for(int i = 0;i <= 3; i++)
    {
        for(int j = 0; j <= 12; j++)
            cout << setw(2)<< deck[i][j] << ' ';
        cout << endl;
    }
    system("pause");    
    return 0;
}
Пробовал через функцию rand() .Но это не то что нужно .Там просто выбирает случайные элементы .А мне нужно чтоб они даже не повторялись.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.06.2011, 21:40     Перемешивание двухмерного массива #2
Я задание не понял. Ты должен пробежаться по массиву и с каждым и с каждым элементом что сделать?
Stenl1
1 / 1 / 0
Регистрация: 01.12.2009
Сообщений: 233
22.06.2011, 21:52  [ТС]     Перемешивание двухмерного массива #3
Запусти ее в IDE .Увидишь она распечатывает массив по порядку от 1 до 52 .Мне надо его перемешать , чтоб он был в разнобой.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.06.2011, 22:03     Перемешивание двухмерного массива #4
ясно, а алгоритм Лемера пойдёт? Это такая штука, которая позволяет делать следующее: пусть имеется 4 числа 0,1,2,3; вот с помощью этого алгоритма их можно выводить так, чтобы они не повторялись и были перемешаны
2,3,1,0
Так, а если бесконечный цикл запустить то будет так:
2,3,1,0,2,3,1,0,2,3,1,0,2,3,1,0,

Кроме того можно менять начальное значение, другие всякие параметры в общем всяко можно мешать, например:3,1,0,2 и т.д., повторяться не будут

По-моему, твой случай
Stenl1
1 / 1 / 0
Регистрация: 01.12.2009
Сообщений: 233
22.06.2011, 22:09  [ТС]     Перемешивание двухмерного массива #5
Ты как бы мне для одномерного массива предлагаешь -если я правильно понял.А мне нужно для двух мерного!
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.06.2011, 22:31     Перемешивание двухмерного массива #6
Да вот не по фиг. Если этот алгоритм тебе подходит в смысле случайности, тогда делай так:
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
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{       
        int card =1;
        int deck[4][13]; //private
 
        for(int row = 0; row <= 3; row++)
        {
                
             for(int column = 0; column <= 12; column++)
                {
                        deck[row][column] = card;
                        card++;
                }
        }
/**********************************/
 //Вывод массива по правильном порядке
          for(int i = 0;i <= 3; i++)
        {
                for(int j = 0; j <= 12; j++)
                        cout << setw(2)<< deck[i][j] << ' ';
                cout << endl;
        }
 
        //Пусть эти числа у тебя выпали с помощью алгоритма Лемера:
        int ch_1= 36;         
        int ch_2= 48;         
        int ch_3= 8;         
        //Вообще-то их должно выпасть 52 неповторяющихся числа, но для примера возьмём три числа
 
 
        //Вывод будешь осуществлять так:
        printf("%d\n", deck [ch_1/13][ch_1%13]); 
        printf("%d\n", deck [ch_2/13][ch_2%13]); 
        printf("%d\n", deck [ch_3/13][ch_3%13]); 
 
        system("pause");        
        return 0;
 
}
Stenl1
1 / 1 / 0
Регистрация: 01.12.2009
Сообщений: 233
22.06.2011, 22:39  [ТС]     Перемешивание двухмерного массива #7
Если так все 52 числа выводить то это полный бред получится , а если их 1000 будет или более.Надо значит что то другое.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.06.2011, 22:49     Перемешивание двухмерного массива #8
Естественно.
Ну, я думаю ты сам дойдёшь как сделать это красиво и компактно. Удачи!
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.06.2011, 01:03     Перемешивание двухмерного массива #9
что вы тут мутите?
C++
1
2
3
4
5
6
7
          for(int j = 0;j <= 12; j++)
              for(int i = 0; i <= 3; i++) {
                  int temp=deck[i][j];
                  int val=rand()%4;
                  deck[i][j]=deck[val][j];
                  deck[val][j]=temp;
              }
Stenl1
1 / 1 / 0
Регистрация: 01.12.2009
Сообщений: 233
23.06.2011, 06:52  [ТС]     Перемешивание двухмерного массива #10
В
C++
1
int val=rand()%4;    deck[i][j]=deck[val][j];
Может же такое быть что случайно сгенерируется одно и тоже число.Тогда в массиве из 52 чисел попадутся 2 одинаковых значения!!??
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.06.2011, 07:40     Перемешивание двухмерного массива #11
Цитата Сообщение от Stenl1 Посмотреть сообщение
как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива
Для этого нужно
Цитата Сообщение от Stenl1 Посмотреть сообщение
в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива
У тебя же алгоритм подробно описан! В чём вообще вопрос то быть может? Обход массива ты делать умеешь. Генерировать случайное число - тоже. В задании не сказано, что ты не можешь менять местами один и тот-же элемент несколько раз, ты это выдумал сам. Сам придумал себе гемор и мучаешься. Делай именно то, что от тебя требуется по заданию и никаких вопросов не возникнет.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.06.2011, 13:08     Перемешивание двухмерного массива #12
Stenl1,
лишних чисел в массиве НЕ появится.
запускать то пробывал?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
23.06.2011, 19:09     Перемешивание двухмерного массива #13
Цитата Сообщение от OstapBender Посмотреть сообщение
что вы тут мутите?



мутишь ты, я дело говорю. Я пробовал запускать.
14 1 40 1
28 41 2 2
3 29 29 3
17 30 4 4
44 5 44 18
19 45 6 19
33 46 33 46
47 8 8 34
35 48 35 48
10 23 10 10
24 24 11 11
12 25 51 25
13 13 26 39
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
23.06.2011, 20:44     Перемешивание двухмерного массива #14
kravam, чего????
что ты за листинг кинул??
он невозможен!
мой алгоритм - это стандартный банальный алгоритм перемешивания (ведь оно нужно ??)
да, некоторые элементы могут переставиться 2 или больше раз, но кого волнует?

цитирую:
Цитата Сообщение от Stenl1 Посмотреть сообщение
Подскажите как можно перемешать двухмерный массив таким образом , чтобы он в цикле по строкам и столбцам массива перебирал элементы массива по разу и менял местами значения текущего элемента и случайно выбранного элемента массива.
привожу 4 скрина работы моей программы
http://s014.***********/i327/1106/74/05336ac879ed.jpg
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.06.2011, 15:56     Перемешивание двухмерного массива #15
OstapBender, я понял, но тогда надо:
C++
1
2
3
4
5
6
7
          int* p= &deck [0][0];
          for(int i = 0;i < 4* 13; i++) {
                                  int temp=p[i];
                                  int val=rand()%(4* 13);
                                  p[i]=p[val];
                                  p[val]=temp;
                          }
, согласись?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
24.06.2011, 16:02     Перемешивание двухмерного массива #16
kravam,
ну да, ты выполнил обычное перемешивание массива, что аналогично std::random_shuffle(&deck[0][0],&deck[0][0]+4*13);

а я сделал случайное перемешивание столбцов.
пусть автор выбирает уже че ему угодно)
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,694
24.06.2011, 16:12     Перемешивание двухмерного массива #17
Если надо каждый только по одному разу дернуть, может что то типа того:
1. Делаем динамический одномерный массив, который просто содержити ндексы исходного
2. бежим по созданному: берем первый элемент, берем случайный рандомом от 2 до последнего
3. меняем выбранные элементы в основном массиве местами
4. удаляем два обработанных элемента из динамического масива
5 продолжаем пп 2-4 пока в динамическом два и больше элементов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2011, 17:04     Перемешивание двухмерного массива
Еще ссылки по теме:

C++ Перемешивание двумерного массива
C++ Из двухмерного массива в одномерный
Случайное перемешивание содержимого одномерного массива C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.06.2011, 17:04     Перемешивание двухмерного массива #18
Как вариант сгодится, трабла в том, что ТС, похоже лень реализовывать. НАдеюсь, что я я ошибаюсь.
Yandex
Объявления
24.06.2011, 17:04     Перемешивание двухмерного массива
Ответ Создать тему
Опции темы

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