**[**Back to NUMBERS SWAG index**]** **[**Back to Main SWAG index**]** **[**Original**]**

*{
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**.

**[**Back to NUMBERS SWAG index**]** **[**Back to Main SWAG index**]** **[**Original**]**