有这个一个2×5数组,如
1 1 1 1 0
1 0 0 1 1,初始值可任意输入,元素全部由0和1组成。上下行中可允许存在1和1,但不允许同时有0和0存在。求这个数组的排列组合。
条件,
a.上下2个元素的和必须为1,即上行为1,下行必须为0,或下行为1,上行必须为0。
b.初始值为0的列,不能变化,如初始值为
1 1 1 1 0
1 0 0 1 1,意味,第2,3,5列的位置不能变化,该数组的有效组合有4个。分别为:
1 1 1 1 0
0 0 0 0 1,1 1 1 0 0
0 0 0 1 1,0 1 1 1 0
1 0 0 0 1,0 1 1 0 0
1 0 0 1 1。
换句话说,初始值中0的位置,决定了可产生有效组合的数量,有效组合数量=2^(5-0的个数)。如,初始值中有2个0,则可产生排列数组有8个,1个0的话,可产生16个,如果没有0的话,产生32个。求给定一个初始值,能产生多少个数组。 
如给定初始值为:
11011
01111或
01111
10111之类的,求能产生多少个类似
11011
00100的组合.

解决方案 »

  1.   

    是的,你说的没错,在题目中的条件里已经说明了,上下行中可允许存在1和1,但不允许同时有0和0存在。
    我现在的思路是想,想设立个2*5数组a作为循环的初始变量,在这个数组a里面将初始值里面的第一行全部设置为1,第二行设置为2。就是说如果初始值为:
    1 1 1 1 0
    1 0 0 1 1
    那么设置的初始2*5数组a变量为
    1 1 1 1 0
    0 0 0 0 1。
    再设立个b(1 to 5)数组,初始值全部为1,然后从原始数据里面提取0,将0放置b()里面,也就是针对
    1 1 1 1 0
    1 0 0 1 1,这个原始数据,0所在的行号是2,3,5,那么b(2),b(3),b(5)就为0。
    然后在这个数组a(i,j)基础上,进行循环,通过比较b(j)的值来判断该行(j)是否能变化。如果能,分别变化,输出。不知道思路是否正确?
      

  2.   

    Function getcount(ByRef x() As Byte) As Integer
    Dim i As Integer, j As Integer
    For i = 0 To 1
    For j = 0 To 4
    getcount = getcount + x(i, j)
    Next
    Next
    getcount = 2 ^ (getcount - 5)
    End FunctionPrivate Sub Command1_Click()
    Dim x(1, 4) As Byte, temp As Single, msg As String
    Dim i As Integer, j As Integer
    For j = 0 To 4
    Randomize
    temp = 2 * Rnd
    x(0, j) = Int(temp)
    x(1, j) = Int(2 - Rnd * temp)
    Next
    For i = 0 To 1
    For j = 0 To 4
    msg = msg & x(i, j) & vbTab
    Next
    msg = msg & vbCrLf
    Next
    MsgBox msg & vbCrLf & getcount(x) & " 种组合!"
    End Sub
      

  3.   

    谢谢northwolves了。不过我想得到的是具体产生的组合,不是组合的总数。
      

  4.   

    终于还是自己弄出来了。虽然自己觉得算法不是很好。
    思路是,先判断列中1的位置,然后用几个变量记住。并获得总数。然后将原始数据(可能包括非法数据),格式成上1,下0,用一个数组存放。接着判断1的总数,然后在这个数组基础上输出可变组合。判断可变列的总数;
    如果是0,无可变列,代表输入初始值有问题,
    如果是1,代表有2个可变组合。用一个循环获得含1的列号,然后输出1,0和0,1,2个组合变化。
    如果是2,代表有4个可变组合。用2个循环来解决,第一循环找第一个可变列1的列号,然后在此基础上进行第二个循环找第二个可变列1的列号,分别变化,输出可变数组。
    如果是3,代表有8个可变组合。如果用循环,判断就太罗嗦复杂了。于是简单点,设置n1,n2,n3分别代表3个可变列的列号,然后设置一个循环从1-5,分别设置3个判断,当循环到n1,n2,n3的时候分别设置变化,输出可变数组。
    如果是4,代表有16个可变组合。用上面的方法解决。
    如果是5,则是全变化,32个可变组合。由于不存在不可变列。就分别对元素进行变化,输出。不过个人感觉这个不是计算机在算,是自己算好后,强加上去的。没法了,先凑合吧。
    谢谢northwolves。谢谢你的热心。送上50分吧。
    如果有高手能作出一个好的算法,请跟贴。谢谢。
      

  5.   

    可以利用三进制,如:
    1 1 1 1 0
    1 0 0 1 1------------->211201 1 1 1 0
    0 0 0 0 1------------->111100 1 1 1 0
    1 1 0 0 1------------->02110