首页 新闻 会员 周边

请教:编码分组全排列的算法

0
悬赏园豆:100 [已解决问题] 解决于 2012-09-23 16:29

首先,感谢大家对问题的关注,对本人的支持!

特别是田林九村,非常辛苦,花了很长的时间,写出了代码。本人致以衷心的感谢!

在这里,我觉得,这和取球还是有一定的区别的,取球的代码的可以写出来。但这里是:

1:分组:假设球有4个,假设分成2组,也就是分2次取出,要全部取出,如1:234/2:134/13:24等等,也就是说,我分成2次取,每次取得球的个数可以不定,可以1、2、3、4个。

    当然也可以分成1、3、4组(次)等等。

而不是一次取2个,分成几次取,全部取尽,如同(4个球,取2个的取法):

4:3/4:2/4:1/3:2/3:1/2:1

 

要说明的是:球是有编号的,也就是1号球与4号球是2个不同球,只是组合是无序的,41==14,1 != 4。

 

同样的道理,如果分成3次取,是:1:2:3/1:3:4等等。

“努力的学习者”提出一个插入分融符的思路,倒是可以考虑的。

在此,再次感谢大家对本人的支持!

 //===================================================

问题已经解决,原理是“插入法”

细想起来,还是跟取球有所区别,代码如下:

void __fastcall TForm1::CodeNum(AnsiString S)
{
  AnsiString sStr; int x,i,j,m,i_count=0;
  if(S.Length() < 3 || S.Length() %3 !=0) return;
  for(x=1;x<S.Length()/3;x++){//分成几组
    Memo1->Lines->Add(""+IntToStr(x)+"种方法:");
    for(i=1;i<S.Length() ;i+=3){//字符串长度
      sStr=S.SubString(i,S.Length()-i+1) + S.SubString(1,i-1); //将编码对调ABCD--BCDA...
      m=0;
      for(j=x;j<S.Length()/3 ;j++){//分别插入
          m++;
          sStr.Insert(":",j*3+m);
          Memo1->Lines->Add(sStr);//结果
          i_count++;
      }//for(j=x;j<=S.Length()/3 ;j++){//分别插入
    }//for(i=1;i<S.Length() ;i+=3){//字符串长度
  }//for(x=1;x<S.Length() /3-1;x++){//分成几组
  Memo1->Lines->Add("共有"+IntToStr(i_count)+"种方法。");
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Text ="";
  CodeNum("000112233444");
}
//---------------------------------------------------------------------------
The Result is:
第1种方法:
000:111222333444
000:111:222333444
000:111:222:333444
000:111:222:333:444
111:222333444000
111:222:333444000
111:222:333:444000
111:222:333:444:000
222:333444000111
222:333:444000111
222:333:444:000111
222:333:444:000:111
333:444000111222
333:444:000111222
333:444:000:111222
333:444:000:111:222
444:000111222333
444:000:111222333
444:000:111:222333
444:000:111:222:333
第2种方法:
000111:222333444
000111:222:333444
000111:222:333:444
111222:333444000
111222:333:444000
111222:333:444:000
222333:444000111
222333:444:000111
222333:444:000:111
333444:000111222
333444:000:111222
333444:000:111:222
444000:111222333
444000:111:222333
444000:111:222:333
第3种方法:
000111222:333444
000111222:333:444
111222333:444000
111222333:444:000
222333444:000111
222333444:000:111
333444000:111222
333444000:111:222
444000111:222333
444000111:222:333
第4种方法:
000111222333:444
111222333444:000
222333444000:111
333444000111:222
444000111222:333
共有50种方法。

谢谢大家!

//=================================================

 

有一个字符串形如:111222333...NNN,每三个数字为一个位,现在要进行分组排列,规则如下:

     分组:以位为单位,求出所有分组的可能性,这样可分成N组。 其中,编码为无序,

        如N=3,

     分成一组:111:222:333 (等同于111:333:111 或333:111:222)

     分成二组,情况如下:

      111:222333;

      111222:333

      111333:222

    (其中111:222333 ==111:333222;222333:111==111:222333)

分成三组是:111:222:333。(其中111:222:333==333:222:111等等)

当N>3时,就复杂了,如N=4

可分成1-4组,如分成三组:

111:222:333444

111:333:222444

111:444:222333

111222:333:444

111333:222:444

111444:222:333

222:111333:444

......





现在,请教,这样的算法用代码该怎么写呢?

谢谢大家!

飞凤的主页 飞凤 | 初学一级 | 园豆:112
提问于:2012-09-22 21:09
< >
分享
最佳答案
0

这是比较简单的排列组合吧,N个球里面分别取1~N个球,分别有几种取法

static void Main(string[] args)
        {
            int N = 4;
            for (int i = 1; i < N + 1; i++)
            {
                Console.WriteLine(N + "个球里面取" + i + "个球的排序组合为:");
                StringBuilder sb = new StringBuilder();
                for (int j = 1; j < N + 2 - i; j++)
                {
                    string lessOne = j.ToString();
                    StringBuilder temp = new StringBuilder();
                    temp.Append(j);
                    if (temp.Length < i)
                    {
                        while (temp.Length < i)
                        {
                            for (int k = j + 1; k < N + 1; k++)
                            {
                                temp.Append(k);
                                if (temp.Length < i)
                                    lessOne = temp.ToString();
                                else
                                {
                                    sb.Append(temp).Append(",");
                                    if (k < N)
                                    {
                                        temp = new StringBuilder();
                                        temp.Append(lessOne);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        sb.Append(temp).Append(",");
                    }
                }
                Console.WriteLine(sb.Remove(sb.Length - 1, 1));
            }
        }

这段代码花了1个小时,还是有点问题,你改进一下吧,改造为递归比较好

收获园豆:80
田林九村 | 老鸟四级 |园豆:2367 | 2012-09-22 23:28
其他回答(4)
0

数学问题。

1-n,n个球

规则:总共n个球,次数不限,每一次的个数不限,取完为止。

问有多少个取法 呗。

代码好些,就是这个事情怎么理解

参考:http://zhidao.baidu.com/question/274911796.html&__bd_tkn__

=689153252f3eda6b5307bc34a9be3ef9991e8ba08078338d51fed8133ea5c69d362ad36

bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157a5bf93b9c66aef1580f03de

0125270aa640be7b4d06ef000c5ec3f8a63f477e742d3128b8670b374fc2ddafec7dfaacc

bdc8d03c83124ff4dae

二十三号同学 | 园豆:974 (小虾三级) | 2012-09-23 05:05
0
jason2013 | 园豆:1998 (小虾三级) | 2012-09-23 07:13
0

这是一个在排列组合里属于组合的问题,球没有编号就都是一样的,所以只涉及到取的个数问题,所以只要考虑每次取的个数,可以把这个问题引申为在这些球之间放隔断,这样就考虑隔断的个数和隔断的方法。

努力的学习者 | 园豆:202 (菜鸟二级) | 2012-09-23 09:50
0

这是个很简单的排列组合的问题,只要把树状图画出来,代码基本上就出来了。。。。。

 

假如有5个球,把这5个球进行组合,从其中不重复的取出4个球,代码如下:

 private void button1_Click(object sender, EventArgs e)
        {
            ArrayList al = new ArrayList();
            string str = "abcde";
            int i = 0;
            int a = 0;
            int b = 0;
            int c = 0;

            for (i = 0; i < str.Length; i++)//第1个数取值
            {
                for (a = i + 1; a < str.Length; a++)//第2个数取值
                {
                    for (b = a + 1; b < str.Length; b++)//第3个数取值
                    {
                        for (c = b + 1; c < str.Length; c++)//第4个数取值
                        {
                            al.Add(str[i].ToString() + str[a].ToString() + str[b].ToString() + str[c].ToString());
                        }
                    }
                }
            }
        }

 

 

经测试,没问题,符合你的要求。。。。。希望你成功!

收获园豆:20
斗天! | 园豆:260 (菜鸟二级) | 2012-09-23 13:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册