有这个一个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 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的组合.
我现在的思路是想,想设立个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)是否能变化。如果能,分别变化,输出。不知道思路是否正确?
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
思路是,先判断列中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分吧。
如果有高手能作出一个好的算法,请跟贴。谢谢。
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