[Все темы по размещениям]
Теория: Окулов. Программирование в алгоритмах. 2004
Практика: K4.Размещения.(dl.gsu.by)
Представим, что нужно рассадить N гостей на M мест, при этом может получиться такая ситуация, что некоторые гости останутся стоять. Занумеруем всех гостей числами от 1 до N. А теперь давайте попробуем перечислить все возможные посадки. Пусть N = 4, а M = 3. Получаем:
- 123
- 124
- 132
- 134
- 142
- 143
- 213
- 214
- 231
- 234
- 241
- 243
- 312
- 314
- 321
- 324
- 341
- 342
- 412
- 413
- 421
- 423
- 431
- 432
Чтобы убедиться в том, что ни одна комбинация не была пропущена, найдем общее количество размещений по формуле A(M,N) = N! / (N-M)! = 4! / 1! = 24. Можно двигаться дальше.
Что касается самого принципа генерации, то он полностью совпадает с принципом генерации перестановок без повторений. Тем более, что если N = M, то будет происходить генерация всех перестановок без повторения.
* This source code was highlighted with Source Code Highlighter.
- int n,m;
- string letters = "1234567";
- vector<bool> usd;
- string res;
- void placement_lex(int pos) {
- if (pos == m) {
- printf("%s\n", res.c_str());
- return;
- }
- for (int i=0;i<n;++i) {
- if (!usd[i]) {
- usd[i] = true;
- res[pos] = letters[i];
- placement_lex(pos+1);
- res[pos] = ' '; // debug only
- usd[i] = false;
- }
- }
- }
- int main() {
- ...
- usd.resize(n);
- res.resize(m,' ');
- placement_lex(0);
- }
Решение: здесь
Спасибо. Выручил.
ОтветитьУдалить