回 帖 发 新 帖 刷新版面

主题:[讨论]排列组合问题-高手请进,全30分

有红色球4个,黄色球3个,白色球3个,将他们排成一排,共有多少种排法?试生成所有的排法。
请各位高手指点!谢谢

回复列表 (共12个回复)

沙发

数量应该是P(10,10) / ( P(4,4)*P(3,3)*P(3,3) )

板凳

麻烦你把算法写出来,并做点说明撒!~~再加```

3 楼

大家帮帮忙啊,只要源程序就给你们30分!

4 楼

[size=6]p[/size]43=4*3*2=24种
原程序不用了吧!

5 楼

1楼的答案应该是对的。

前几天我看到一个全排列的例子,可以参照下面的帖子:
http://www.programfan.com/blog/article.asp?id=582
其实这个帖子我只看了上面全排列的部分。(^_^)

我有个想法,所给条件有重复和无重复,是可以归并为一个程序的。
下面我刚刚编的程序,还没经过严密测试。这个程序,当所给条件无重复时,就形成了全排列,当所给条件有重复时,也不会出现重复排列。总的来说,在考验递归的功夫。如果不对告诉我啊!

R : 代表红球, Y : 代表黄球   W :代表白球。

var
   s : string;
   t : longint;

procedure  proc(k:integer);
var
    i,j,p : integer;
    c : char;
begin
     if k > length(s) then
       begin
           t := t+1;
           writeln(t:10,' : ',s);
           exit;
       end;
     for i:=k to length(s) do
        begin
            p := 1;
            for j := i+1 to length(s) do
                if  s[i] = s[j] then p := 0;
            if p=1 then
              begin
                 c := s[k];   s[k] := s[i];   s[i] := c;
                 proc(k+1);
                 c := s[k];   s[k] := s[i];   s[i] := c;
               end;
       end;
end;

begin
    s := 'RRRRYYYWWW';    t := 0;
    proc(1);
end.

6 楼

这里是不是有点问题哟~~~
begin
    s := 'RRRRYYYWWW';    t := 0;
    proc(1);//可以直接输入1吗?过程的数据传递要通过变量来实现吧?
end.

7 楼

to 6楼:当然可以直接输1。过程的数据传递不一定都要通过变量来实现。举个例子:求2的平方根可以直接用sqrt(2),而不需要用变量传。

参数如果是形参(我记得pascal书是写“形参”吧),既可用常数,也可以用变量传。仅是数值传送,调用过程时,参数在内存里是另外开辟空间的。在过程里改变参数的值,返回外部主程序,变量的值不会改变。
但如果是变参,就只能用变量传递。调用过程时传送的是地址,不开辟新空间,在过程里改变参数的值,返回外部主程序,变量的值会被改变。

例如下面的函数,不能用proc(1)来调用:
procedure  proc(VAR k:integer);

8 楼

呵呵~好的,我书上有形参实参的介绍看得太久了记不太清楚了,,,,呵呵再学习再学习~~

9 楼

简单的回溯。。。。。。。
懒了。。。。。。

10 楼

4*10+3*10+3*10-(4+3+3)*2
(以上式子仅供参考)
不知对不对
应该是先算出当每个球都不同时的排列数目,在减去由于相同花色的球而表面相同的排列方法

我来回复

您尚未登录,请登录后再回复。点此登录或注册