http://expert.csdn.net/Expert/topic/1991/1991952.xml?temp=.5721399
为任意个数字的全排列;
下面列出的7个数字的全排列算法;
这里有些局限性,朋友们可以改一改;
比如数组声明写死了等...
procedure TForm1.pergen(const n: integer);
label l;
var
    p,q,r,i,k:integer;
    a:array[1..7] of integer;
    e,d:array[2..7] of integer;
    tempStr:string;
begin
    a[1] :=1;
    for i := 2 to n do
    begin
        a[i] := i;
        d[i] := i;
        e[i] := -1;
    end;
l:
    q:=0;
    tempStr := '';
    for i := 1 to n do
    begin
        tempStr:= tempStr + inttostr(a[i]);
    end;
    listbox1.Items.Add(tempStr);
    for k:= n downto 2 do
    begin
        d[k] := d[k]+e[k];;
        p:=d[k];
        if p=k then
            e[k]:=-1
        else if p=0 then
        begin
            e[k]:=1;q:=q+1;
        end else
        begin
            p:=p+q; r:=a[p];a[p]:=a[p+1];
            a[p+1] := r; goto l
        end;
    end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
    pergen(7);
end;
这是组合数学的知识

解决方案 »

  1.   

    改了一下:procedure TForm1.pergen(const n: integer);
    label l;
    var
        p,q,r,i,k:integer;
        a:array of integer;
        e,d:array of integer;
        tempStr:string;
    begin
        SetLength(a,n+1);
        SetLength(e,n+1);
        SetLength(d,n+1);
        try
            a[1] :=1;
            for i := 2 to n do
            begin
                a[i] := i;
                d[i] := i;
                e[i] := -1;
            end;
        l:
            q:=0;
            tempStr := '';
            for i := 1 to n do
            begin
                tempStr:= tempStr + inttostr(a[i]);
            end;
            listbox1.Items.Add(tempStr);
            for k:= n downto 2 do
            begin
                d[k] := d[k]+e[k];;
                p:=d[k];
                if p=k then
                    e[k]:=-1
                else if p=0 then
                begin
                    e[k]:=1;q:=q+1;
                end else
                begin
                    p:=p+q; r:=a[p];a[p]:=a[p+1];
                    a[p+1] := r; goto l
                end;
            end;
        finally
            a:=nil;
            e:=nil;
            d:=nil;
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        pergen(7);
    end;
      

  2.   

    我上面给你的是排列的结果
    你没看到   listbox1.Items.Add(tempStr);吗,那里就是结果的输出;
    上面的算是不要求个数,那是个通用算法,你稍微改改就行了;
    如果你非要我把代码写全了,请看:
    *****************************
    procedure TForm1.pergen(a:numArray;const n:integer);
    label l;
    var
        p,q,r,i,k:integer;
        //a:array of integer;
        e,d:array of integer;
        tempStr:string;
    begin
        SetLength(a,n+1);
        SetLength(e,n+1);
        SetLength(d,n+1);
        try
            //a[1] :=1;
            for i := 2 to n do
            begin
                //a[i] := i;
                d[i] := i;
                e[i] := -1;
            end;
        l:
            q:=0;
            tempStr := '';
            for i := 1 to n do
            begin
                tempStr:= tempStr + inttostr(a[i]);
            end;
            //输出结果
            listbox1.Items.Add(tempStr);
            for k:= n downto 2 do
            begin
                d[k] := d[k]+e[k];;
                p:=d[k];
                if p=k then
                    e[k]:=-1
                else if p=0 then
                begin
                    e[k]:=1;q:=q+1;
                end else
                begin
                    p:=p+q; r:=a[p];a[p]:=a[p+1];
                    a[p+1] := r; goto l
                end;
            end;
        finally
            a:=nil;
            e:=nil;
            d:=nil;
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
        a:numArray;
        i:integer;
    begin
        listbox1.Clear;
        //如果是5个数,随机初始化数组;
        setlength(a,5+1);
        for i := 1 to 5 do
        begin
            a[i] := random(9);
        end;
        //全排列,并输出结果
        pergen(a,5);
        a := nil;
    end;
      

  3.   

    错了,同时把函数pergen里的
    SetLength(a,n+1);
    a:=nil;
    注释掉;因为数组已经自外面初始化了,由外面释放了
      

  4.   

    先声明一下
    type
      numArray = array of integer;注意:
    你要的所有要求都满足了
    1、我随机的输入几个数
       个数是不定的
       取这几个数的
        for i := 1 to 5 do
        begin
            a[i] := random(9);
        end;
    //以上代码满足随机生成几个数,初始化数组;
    //你不会连在10个数中去5个随机的数都不会把;我想你应该会的
    //所以,我没有给出多个随机数,然后再在里面抽,我只给出了,
    //相当于随即抽取的要求数量的数2、
    排列结果
    如果数的个数是一定的
    那我只用几个嵌套循环不就得了吗//你用几个嵌套是出不来的;不信你试试3、
    这些数是未知
    是动态输入
    //我已经动态的生成随机数了4、用goto问题,如果你用的不好请不要用
    并不是说用goto不要,而是很多程序员乱用,导致程序的控制流程无序
    相信我,这是最好的,用goto没问题的;
      

  5.   

    郁闷第一个回复没跟上
    对于P(n,n)
    这其实可以看作是8皇后问题的变体
    用回溯算法就可以了吧