Перебор всех возможных комбинаций динамического массива

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Ejara
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.10.2002 (Пн) 1:59
Откуда: Russia

Перебор всех возможных комбинаций динамического массива

Сообщение Ejara » 31.01.2007 (Ср) 17:26

Не ругайте меня сильно, но ничего конкретного не смог найти на форуме.
Задача такая: имеется одномерный динамический массив. Необходимо получить все возможные перестановки элементов массива без повторений.
Получал много ответов типа "Да это фигня! Все делается рекурсивно!" и т.д. но тут барану ясно что рекурсивно, а КАК?
Если можно хотел бы посмотреть на код.
Бери добро и бросай его в воду.....

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.01.2007 (Ср) 22:29

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ejara
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.10.2002 (Пн) 1:59
Откуда: Russia

Сообщение Ejara » 01.02.2007 (Чт) 15:35

GSerg писал(а):http://algolist.manual.ru/maths/combinat/index.php


Ну конечно спасибо - это уже кое что, но это на паскале!?
а не будет это уж сильной наглостью если я вместо того чтоб по ламерски сидеть и пыхтеть разбираясь в хитросплетениях незнакомого языка попрошу кого нибудь уважаемого и знающего пояснить мне данный код с уклоном в VB.
Заранее очень благодарен.
Бери добро и бросай его в воду.....

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.02.2007 (Чт) 16:21

Гм... давай сюды паскалевский текст и свои попытки перевда на VB. Бум посмотреть, что не получаецца
Весь мир матрица, а мы в нем потоки байтов!

Ejara
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.10.2002 (Пн) 1:59
Откуда: Russia

Сообщение Ejara » 01.02.2007 (Чт) 16:43

Опишем рекурсивную процедуру Generate(k), предъявляющую все перестановки чисел 1,...,N, у которых фиксировано начало X[1],X[2],...,X[k]. После выхода из процедуры массив X будут иметь то же значение, что перед входом (это существенно!). Понятно, что при k=N мы снова имеем только тривиальное решение - саму перестановку. При k<N будем сводить задачу к k+1:
procedure Generate(k:byte);
var i,j:byte;
procedure Swap(var a,b:byte);
var c:byte;
begin c:=a;a:=b;b:=c end;
begin
if k=N then
begin for i:=1 to N do write(X[i]);writeln end
else
for j:=k+1 to N do
begin
Swap(X[k+1],X[j]);
Generate(k+1);
Swap(X[k+1],X[j])
end
end;
Основная программа:
program PerestanovkiRecursion;
type Pere=array [byte] of byte;
var N,i,j:byte;
X:Pere;
procedure Generate(k:byte);
...............
begin
write('N=');readln(N);
for i:=1 to N do X[i]:=i;
Generate(0)
end.


А надо сделать следующее:
имееца слово например "МИР" т.е. а(0)=М, а(1)=И, а(3)=Р
надо например в листбоксе получить
МИР
РИМ
ИМР
ИРМ
РМИ
РИМ
и длинна слова может быть любая.
Бери добро и бросай его в воду.....

Ejara
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.10.2002 (Пн) 1:59
Откуда: Russia

Сообщение Ejara » 01.02.2007 (Чт) 16:48

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim wordLengt As Integer
Dim i As Int16
wordLengt = Len(TextBox1.Text) 'длинна слова
Dim strArray(wordLengt) As String 'массив с буквами

For i = 0 To wordLengt - 1 'заполняю массив
strArray(i) = Mid(TextBox1.Text, i, 1)

Next

For i = 0 To Factorial(wordLengt) ' количество перестановок

Дальше я немогу сообразить ......................Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!???

Next

End Sub
[/quote]
Бери добро и бросай его в воду.....

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 03.02.2007 (Сб) 14:14

Массив в котором на каждую букву присвоенно по байту с количеством этих букв (чтоб сразу реализовать без повторений) плюс функция которая получает в параметах текущее слово и массив оставшихся буков. Функция запускает сама себя с параметром текущего слова увеличенного на одну букву (по разу для каждой оставшейся буквы) и соответственно уменьшившимся массивом букв. Если функция получает пустой массив букв, то она записывает текущее слово в результаты.

В программе одна строчка пускающая нашу функцию с переработанным чуток исходным массивом. За один проход пройти по нему Раскидывая имеющиеся буквы по ячейкам рабочего массива.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

    TopList