Contributor: CLIVE MOSES { DC>I have a little major problem... And offcourse I want YOU to help me! DC>I want to write something that gives of a 8-letter word all the possible DC>combinations. So that 'RDEPTRAO' gives 'PREDATOR'. I think it must be about DC>256 combinations. I don't need a program that gives 'PREDATOR' directly, but DC>just something that gives me all those possibilities. Here is something that may help you a little. It works fine on my PC with one small proviso. If you specify permutations of 8 objects taken 8 at a time (what you want ...) then the program runs out of heap space. Try it will smaller numbers first - like permutations of 5 objects taken 3 at a time. This will show you how it works. You can then try to modify it so that it will not run out of memory generating the 40320 permutations that you are looking for. Program perms, written by Clive Moses. This program will generate all permutations of n objects, taken r at a time, memory allowing. Challenge: try to modify the program so that it will not guzzle massive amounts of memory generating its output. } program perms; { Program to generate permutations of n objects, taken m at a time. For test purposes: m <= n <= 8. The program, as implemented here, effectively uses a 'breadth-first' algorithm. If it could be changed to run in a 'depth-first' fashion, it would not be necessary to store all of the intermediate information used to create the permutations. A 'depth-first' algorithm might have to be recursive however. } uses crt; type str8 = string[8]; torec = ^rec; rec = record perm, left : str8; next : torec; end; const objects : str8 = 'abcdefgh'; var m, n : integer; first : torec; procedure NewRec (var p : torec); begin NEW (p); with p^ do begin perm := ''; left := ''; next := NIL; end; end; procedure PrintPerms (var first : torec); var p : torec; count : integer; begin p := first; count := 0; while p<>NIL do begin if p^.perm <> '' then begin write (p^.perm:8); inc (count); end; p := p^.next; end; writeln; writeln; writeln (count,' records printed.'); end; procedure MakePerms (m, n : integer; var first : torec); var i, level : integer; p, p2, temp : torec; begin writeln ('Permutations of ',n,' objects taken ',m,' at a time ...'); writeln; if m <= n then begin level := 0; NewRec (first); first^.left := copy (objects, 1, n); while level < m do begin p2 := NIL; temp := NIL; p := first; NewRec (p2); while p <> NIL do begin for i := 1 to length(p^.left) do begin if temp=NIL then temp := p2; p2^.perm := p^.perm + p^.left[i]; p2^.left := p^.left; delete (p2^.left, i, 1); NewRec (p2^.next); p2 := p2^.next; end; p := p^.next; end; inc (level); p := first; while p<>NIL do begin p2 := p^.next; dispose (p); p := p2; end; first := temp; end end; end; begin { Main Program } clrscr; first := NIL; writeln ('Memory available = ',memavail); writeln; repeat write ('Total number of objects: '); readln (n); until n in [1..8]; repeat write ('Size of permutation: '); readln (m); until m in [1..n]; MakePerms (m, n, first); PrintPerms (first); writeln; writeln ('Memory available = ',memavail); end.