排列组合有关问题,由于超过了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

------解决方案--------------------

* 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,,,,,,