Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
1

Перемешать массив

21.03.2015, 18:35. Показов 3314. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Перемешать массив чисел по правилам:
1) Позиция каждого элемента после перемешивания должна отличаться от его позиции до переме-
шивания.
2) Если до перемешивания два элемента находились на соседних позициях, после перемешивания
они не должны располагаться на соседних позициях.

Что-то не могу написать....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2015, 18:35
Ответы с готовыми решениями:

Перемешать массив строк.
Здравствуйте, не могу сделать программу, где будет генерироваться имена без повторов, тоесть даны к...

Как перемешать одномерный массив?
Никак не могу придумать как сделать так чтобы цифры не повторялись в некоторых случаях больше чем...

Перемешать массив так, чтобы числа в нём не повторялись
как сделать чтоб при выводе числа не повторялись ? #include "stdafx.h" #include <iostream>...

Перемешать random();
Здравствуйте. Пишу под ардуинку программу. Хочу использовать там генератор случайных чисел. Мне...

7
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
21.03.2015, 22:47 2
leva, Не претендую на идеальность решения, перемешивает всегда одинаковым образом, но с удовлетворением поставленных условий:
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
140
141
142
143
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <utility>
 
std::ostream &operator<<(std::ostream &out, const std::vector<int> &vec) {
  std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(out, " "));
  return out;
}
 
std::pair<int, int> CreateNewNeibors(int first, int second) {
  return std::make_pair(first, second);
}
 
struct TrueFalse {
  TrueFalse(bool is_now_true) : is_now_true_(is_now_true) {}
 
  template <typename T>
  bool operator()(T) {
    return is_now_true_ = !is_now_true_;
  }
 
  bool is_now_true_ = false;
};
 
std::vector<int> ShuffledWithNoNeigbours(const std::vector<int> &vec) {
  std::vector<int> no_neigbours;
  std::copy_if(vec.begin(), vec.end(), std::back_inserter(no_neigbours),
               TrueFalse(true));
  std::copy_if(vec.begin(), vec.end(), std::back_inserter(no_neigbours),
               TrueFalse(false));
  return no_neigbours;
}
 
void SwapMiddleIfVectorSizeOdd(std::vector<int> &vec) {
  if (vec.size() % 2 == 1) {
    auto middle = vec.begin() + vec.size() / 2;
    std::swap(*middle, vec.back());
  }
}
 
std::vector<int> Rearrange(const std::vector<int> &vec) {
  std::vector<int> rearranged(vec);
  SwapMiddleIfVectorSizeOdd(rearranged);
  return ShuffledWithNoNeigbours(rearranged);
}
 
std::vector<int> MarkAtOldPosition(const std::vector<int> &old,
                                   const std::vector<int> &rearranged) {
  std::vector<int> at_old_position(old.size());
  for (size_t i = 0; i < old.size(); ++i) {
    if (old[i] == rearranged[i]) {
      at_old_position[i] = 1;
    }
  }
  return at_old_position;
}
 
std::vector<int> HasSameNeigbours(const std::vector<int> &old,
                                  const std::vector<int> &rearranged) {
  std::vector<int> has_old_neigbors(rearranged.size());
  for (size_t i = 0; i < old.size(); ++i) {
    auto rearranged_pos =
        std::find(rearranged.begin(), rearranged.end(), old[i]);
    if ((rearranged_pos != rearranged.begin() &&
         (old[i - 1] == *(rearranged_pos - 1))) ||
        (rearranged_pos + 1 != rearranged.end() &&
         old[i + 1] == *(rearranged_pos + 1))) {
 
      has_old_neigbors[std::distance(rearranged.begin(), rearranged_pos)] = 1;
    }
  }
  return has_old_neigbors;
}
 
struct EqualToZero {
  template <typename T>
  bool operator()(T element) {
    return element == 0;
  }
};
 
bool AllZero(const std::vector<int> vec) {
  return std::all_of(vec.begin(), vec.end(), EqualToZero());
}
 
void ShowDebug(const std::vector<int> &array,
               const std::vector<int> &rearranged,
               const std::vector<int> &old_pos_marks,
               const std::vector<int> &has_same_neigbours) {
  std::cout << "array      : " << array << '\n';
  std::cout << "rearranged : " << rearranged << '\n';
  std::cout << "old pos    : " << old_pos_marks << '\n';
  std::cout << "same_neigb : " << has_same_neigbours << '\n';
}
 
bool IsBrutForceTestPassed() {
  for (size_t i = 4; i < 20; ++i) {
    std::vector<int> array(i);
    std::generate_n(array.begin(), i, std::rand);
    auto rearranged = Rearrange(array);
    auto old_pos_marks = MarkAtOldPosition(array, rearranged);
    auto has_same_neigbours = HasSameNeigbours(array, rearranged);
    if (!AllZero(old_pos_marks) || !AllZero(has_same_neigbours)) {
      ShowDebug(array, rearranged, old_pos_marks, has_same_neigbours);
      return false;
    }
  }
  return true;
}
 
void ShowExample() {
  std::cout << "This is example:\n";
  std::vector<int> array = {7, 3, 2, 1, 4, 6, 9};
  auto rearranged = Rearrange(array);
  auto old_pos_marks = MarkAtOldPosition(array, rearranged);
  auto has_same_neigbours = HasSameNeigbours(array, rearranged);
  ShowDebug(array, rearranged, old_pos_marks, has_same_neigbours);
}
 
void ShowBurtFroceTestResults() {
  std::cout << "Is brut force test passed: " << std::boolalpha
            << IsBrutForceTestPassed() << '\n';
}
 
void ShowTestDoNotLie() {
  std::cout << "Test don't lie:\n";
  std::cout << MarkAtOldPosition({1}, {1}) << '\n';
  std::cout << MarkAtOldPosition({1, 2}, {1, 2}) << '\n';
  std::cout << MarkAtOldPosition({1, 2, 3}, {1, 2, 3}) << '\n';
  std::cout << MarkAtOldPosition({1, 2, 3}, {3, 2, 1}) << '\n';
  std::cout << HasSameNeigbours({1}, {1}) << '\n';
  std::cout << HasSameNeigbours({1, 2}, {1, 2}) << '\n';
  std::cout << HasSameNeigbours({1, 2, 3}, {1, 2, 3}) << '\n';
  std::cout << HasSameNeigbours({1, 2, 3}, {3, 2, 1}) << '\n';
}
 
int main() {
  ShowTestDoNotLie();
  ShowExample();
  ShowBurtFroceTestResults();
}
Пруф работоспособности:
http://ideone.com/efiDqw

Добавлено через 3 минуты
Убил около 4 часов на такое решение, наводить красоту уже нет мотивации.

Добавлено через 8 минут
Идея проста, все элементы с нечетным индексом - поместить последовательно в начало, затем все элементы с четным индексом. Плюс при нечетном размере массива поменять местами центральный элемент и последний в массиве (хотя больше выглядит как костыль).
0
12 / 12 / 6
Регистрация: 27.11.2013
Сообщений: 73
22.03.2015, 01:20 3
Так пойдёт?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <algorithm>
#include <vector>
#include <iostream>
 
using namespace std;
 
auto my_shuffle = [](auto first, auto last)
{
    while (first + 1 != last)
    {
        rotate(first, first + 1, last);
        rotate(first, first + 1, --last);
    }
};
 
int main()
{
    vector<int> v{1, 2, 3, 4, 5, 6, 7};
    my_shuffle(std::begin(v), std::end(v));
}
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
22.03.2015, 02:48 4
catr, нет, например на {1, 2, 3, 4} он выдает 4 2 3 1 - , где 1 и 2 элемент не удовлетворяют условию задачи. Один из правильных ответов - 2 4 1 3
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 2
22.03.2015, 03:02 5
Есть решение значительно проще, но подожду пока контест закончится.
И библиотека vector вроде в запрещенных...
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
22.03.2015, 11:50  [ТС] 6
В чем вы компилировали этот код?
У меня куча ошибок пишет
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
22.03.2015, 11:58 7
leva, любой компилятор, поддерживающий стандарт с++11.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 2
22.03.2015, 18:11 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
#include <iostream>
 
using namespace std;
 
int lN, vn[100001];
 
int main()
{
    cin >> lN;
    if (lN < 4)
    {
        cout << "No solution";
        return 0;
    }
 
    for (int i = 0; i < lN; i++)
    {
        vn[i] = i + 1;
    }
 
    int tmp;
    for (int i = 0; i < lN - (lN % 2 == 0 ? 0 : 1); i += 2)
    {
        tmp = vn[i];
        vn[i] = vn[i + 1];
        vn[i + 1] = tmp;
    }
    for (int i = 1; i < lN - 1; i += 2)
    {
        tmp = vn[i];
        vn[i] = vn[i + 1];
        vn[i + 1] = tmp;
    }
 
 
    for (int i = 0; i < lN; i++)
    {
        cout << vn[i] << endl;
    }
    return 0;
}
0
22.03.2015, 18:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2015, 18:11
Помогаю со студенческими работами здесь

перемешать матрицу
Вобщем нужен только сам цикл который бы перемешивал все элементы в матрице случайным образом,хотя...

C++ Перемешать буквы слов из файла
И так, у меня задача написать игру &quot;Угадай слово&quot;. Есть текстовый файл со словами из 5 букв,...

Перемешать числа в случайном порядке
Есть набор чисел: { 1, 2, 3, 4, 5, 6, 7, 8, 0 } Нужно написать функцию, которая будет...

Рандомно перемешать слова n раз
Смотрите прогг запрашивает число ,количество треков ,например мы ввели 5 Затем оно запрашивает у...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru