Perm(S) = { ax | a is in S and x is in Perm(S\{a}) }For instance, is S is the set {a,b,c}, then Perm(S) contains the following 6 sequences:
abc , acb , bac , bca , cab , cba
Assuming that the elements of S are stored in an array A with n+1 elements (whose positions range from 0 to n), we can write a recursive procedure printing all the permutations in the follwing way:
procedure perm(i:integer);
var j:integer;
begin
if i=n then print_array
else for j:=i to n do
begin
swap(A[i],A[j]);
perm(i+1);
swap(A[i],A[j])
end
end;
The procedure should be called with the command
perm(0);
**** **** *** * * *** ** ** * x ** *********
In this maze it is possible to reach the exit. Note that a maze might contain a loop, like for instance in the following case:
*********
*** **
*** ** **
* x **
*********
We want of course to avoid looping forever;
we want the program to be able to detect that
a certain position has been already visited and
avoid passing through it again.
Note that, in this second example, it
is not possible to reach the exit.
In this case, the program should
terminate with failure.
The following Pascal-like program is a possible solution. The type "position" represents a position in the array, i.e. a pair [i,j] (i is the index of row, ranging from 0 to m, and j is the index of column, ranging from 0 to n). We use the boolean var parameter "found" to indicate whether we have found the exit or not. The names of auxiliary procedures and functions should be self-explicatory.
procedure search_exit(p:position; var found:boolean);
begin
if on_the_wall(p)
then found := false
else if on_the_border(p)
then found := true
else begin
put_a_brick(p);
search_exit(north(p),found);
if not found
then begin
search_exit(east(p),found);
if not found
then begin
search_exit(south(p),found);
if not found
then search_exit(west(p),found)
end
end
end
end
The following is the C version of the same procedure:
void search_exit(int i, int j, int *found){
if (A[i][j] == '*')
*found = 0;
else if (i==0 || i==m || j==0 || j==n)
*found = 1;
else {
A[i][j] = '*';
search_exit(i-1,j,found);
if (! *found){
search_exit(i,j+1,found);
if (! *found){
search_exit(i+1,j,found);
if (! *found)
search_exit(i,j-1,found);
}
}
}
}