排列组合有关问题,由于超过了3个连续回复贴,不得不重新开了一个主题
排列组合问题,由于超过了3个连续回复贴,不得不重新开了一个主题
原来的题目是:
有ABCDEFGH 8个格子,用1-8的数字进行填写8组。
要求:
1.每个数字一组中1-8的数字只能填一次;
2.相同格子的数字不能与其他组有重复
3.相临位置的两个数字不能与与其他组有重复,如第一组为12345678,则第二组中不能有12,23,或78等出现,但可以为21、87的组合排列。
SET TALK off
SET SAFETY off
CLOSE ALL
CLEAR ALL
CLEAR
DIMENSION bb(9),cc(9)
bb=0
d=0
use tmp1 &&1-8的全排列记录,字段名(数值型)为id1,id2,...,id8
a=1
DO whil a>0
SELECT (a)
bb(a)=bb(a)+1
IF bb(a)>RECCOUNT()
bb(a)=0
a=a-1
IF a>d
?
d=MAX(d,a)
?bb(1),a,d
FOR i=1 TO a
?cc(i)
NEXT
endif
loop
endif
GOTO (bb(a))
i1=id1
i2=id2
i3=id3
i4=id4
i5=id5
i6=id6
i7=id7
i8=id8
cc(a)=STR(i1,1,0)+STR(i2,1,0)+STR(i3,1,0)+STR(i4,1,0)+STR(i5,1,0)+STR(i6,1,0)+STR(i7,1,0)+STR(i8,1,0)
USE IN (a+1)
COPY TO ("tmp"+STR(a+1,1,0)) FOR AT(STR(id1,1,0)+STR(id2,1,0),cc(a))+AT(STR(id2,1,0)+STR(id3,1,0),cc(a))+AT(STR(id3,1,0)+STR(id4,1,0),cc(a))+AT(STR(id4,1,0)+STR(id5,1,0),cc(a))+AT(STR(id5,1,0)+STR(id6,1,0),cc(a))+AT(STR(id6,1,0)+STR(id7,1,0),cc(a))+AT(STR(id7,1,0)+STR(id8,1,0),cc(a))=0 and id1<>i1 and id2<>i2 and id3<>i3 and id4<>i4 and id5<>i5 and id6<>i6 and id7<>i7 and id8<>i8
USE ("tmp"+STR(a+1,1,0)) IN (a+1)
a=a+1
ENDDO
RETURN
------解决方案--------------------
------解决方案--------------------
因为两数配对
所以最多不碰撞的排列数为:n(n-1)/2 = 8x7/2=28对
所以只能是 8x7 格子
8x8 是有碰撞的
------解决方案--------------------
油
这么厉害
楼主是都教授吗
穿越来自哪个星星呀
我要理一下思路
ing,,,,,,
原来的题目是:
有ABCDEFGH 8个格子,用1-8的数字进行填写8组。
要求:
1.每个数字一组中1-8的数字只能填一次;
2.相同格子的数字不能与其他组有重复
3.相临位置的两个数字不能与与其他组有重复,如第一组为12345678,则第二组中不能有12,23,或78等出现,但可以为21、87的组合排列。
SET TALK off
SET SAFETY off
CLOSE ALL
CLEAR ALL
CLEAR
DIMENSION bb(9),cc(9)
bb=0
d=0
use tmp1 &&1-8的全排列记录,字段名(数值型)为id1,id2,...,id8
a=1
DO whil a>0
SELECT (a)
bb(a)=bb(a)+1
IF bb(a)>RECCOUNT()
bb(a)=0
a=a-1
IF a>d
?
d=MAX(d,a)
?bb(1),a,d
FOR i=1 TO a
?cc(i)
NEXT
endif
loop
endif
GOTO (bb(a))
i1=id1
i2=id2
i3=id3
i4=id4
i5=id5
i6=id6
i7=id7
i8=id8
cc(a)=STR(i1,1,0)+STR(i2,1,0)+STR(i3,1,0)+STR(i4,1,0)+STR(i5,1,0)+STR(i6,1,0)+STR(i7,1,0)+STR(i8,1,0)
USE IN (a+1)
COPY TO ("tmp"+STR(a+1,1,0)) FOR AT(STR(id1,1,0)+STR(id2,1,0),cc(a))+AT(STR(id2,1,0)+STR(id3,1,0),cc(a))+AT(STR(id3,1,0)+STR(id4,1,0),cc(a))+AT(STR(id4,1,0)+STR(id5,1,0),cc(a))+AT(STR(id5,1,0)+STR(id6,1,0),cc(a))+AT(STR(id6,1,0)+STR(id7,1,0),cc(a))+AT(STR(id7,1,0)+STR(id8,1,0),cc(a))=0 and id1<>i1 and id2<>i2 and id3<>i3 and id4<>i4 and id5<>i5 and id6<>i6 and id7<>i7 and id8<>i8
USE ("tmp"+STR(a+1,1,0)) IN (a+1)
a=a+1
ENDDO
RETURN
------解决方案--------------------
* 8-C-2 组合算法:
* (2n-1, 2n) 相邻对交换 : 第一组组合
* (2n, 2n+1) 相邻对交换 : 第二组组合
* N = Int((Alen(Arr)-2)/2)
* By Tony Vignone
Local Array Arr(8)
Local ;
I, ; && 数组下标
N, ; && 运行次数
m && 运行计数
Local temp && 交换
N = Int((Alen(Arr)-2)/2)
* 排列不同的 Arr(I) 数组值,会有不同的组合
For I = 1 To Alen(Arr)
Arr(I) = I
Next
Clear
adisplay(@Arr)
For m = 1 To N && 获得后两位的组合
For I = 1 To Alen(Arr) Step 2
temp = Arr(I) && 交换 1,2 3,4 等等
Arr(I) = Arr(I + 1)
Arr(I + 1) = temp
Next
adisplay(@Arr)
For I = 2 To Alen(Arr) - 1 Step 2
temp = Arr(I) && 交换 2,3 4,5 等等
Arr(I) = Arr(I + 1)
Arr(I + 1) = temp
Next
adisplay(@Arr)
Next
*================
Procedure aDisplay(Arr)
External Array Arr
Local I
For I = 1 To Alen(Arr)
?? Arr(I)
Next
?
Endproc
*----------
------解决方案--------------------
因为两数配对
所以最多不碰撞的排列数为:n(n-1)/2 = 8x7/2=28对
所以只能是 8x7 格子
8x8 是有碰撞的
------解决方案--------------------
油
这么厉害
楼主是都教授吗
穿越来自哪个星星呀
我要理一下思路
ing,,,,,,