有 120 种排法。
分步骤讨论如下:
一、先将 abc 进行排列
3! = 6 种情形;以 y 表示占位,x 表示待选,xyxyxyx;为确保 abc 不相邻,中间 2 个位置必须选;
二、插入 edf ,分两种情况
第一种,edf 都分开
在 4 个空位置选择 3 个,中间 2 个必须选,因此只有 2 种选法,一共有 2×3! = 12 种情形;即,6×12 = 72 种方案;
第二种,ef 或 df 合并插入
只能选中间 2 个必选位置,de 分开插入,有 2 种排列,f 有 2 种选择,f 与合并的 d 或 e 位置交换有 2 种选择,即 2×2×2 = 8 种情形;一共有 6×8 = 48 种方案;
三、合计
有 72+48 = 120 种排列方案。
当然,也可以用编程枚举来求解,当作是验证。
fortran 代码
! fortran
character*6 h
character*2 s(8)
data h/'a'/,m/0/
data s/'ab','ba','bc','cb','ca','ac','de','ed'/
do
call kind(h)
if(h.eq.' ') exit
if(sum(index(h,s)).gt.0) cycle
m=m+1; write(*,'(2a$)') h,', '
if(mod(m,6).eq.0) write(*,*)
end do
write(*,'(ag0)') 'total = ',m
end
subroutine kind(h)
character h*(*)
character ch
save
data n/0/
if(n.eq.0) then
n=len(h)
i1=ichar(h(1:1))
do i=2,n
h(i:i)=char(i1+i-1)
end do
if(n+i1.gt.255) then
h=' '
n=0
end if
return
end if
do i=n-1,1,-1
if(h(i:i).lt.h(i+1:i+1)) exit
end do
if(i.lt.1) then
h=' '
n=0
return
end if
do j=i+1,(n+i)/2
ch=h(j:j)
h(j:j)=h(n-j+i+1:n-j+i+1)
h(n-j+i+1:n-j+i+1)=ch
end do; ch=h(i:i)
do j=i+1,n
if(h(j:j).gt.ch) exit
end do
h(i:i)=h(j:j)
h(j:j)=ch
end
运行结果
adbecf, adbefc, adbfce, adbfec, adcebf, adcefb,
adcfbe, adcfeb, adfbec, adfceb, aebdcf, aebdfc,
aebfcd, aebfdc, aecdbf, aecdfb, aecfbd, aecfdb,
aefbdc, aefcdb, afbdce, afbecd, afcdbe, afcebd,
afdbec, afdceb, afebdc, afecdb, bdaecf, bdaefc,
bdafce, bdafec, bdceaf, bdcefa, bdcfae, bdcfea,
bdfaec, bdfcea, beadcf, beadfc, beafcd, beafdc,
becdaf, becdfa, becfad, becfda, befadc, befcda,
bfadce, bfaecd, bfcdae, bfcead, bfdaec, bfdcea,
bfeadc, bfecda, cdaebf, cdaefb, cdafbe, cdafeb,
cdbeaf, cdbefa, cdbfae, cdbfea, cdfaeb, cdfbea,
ceadbf, ceadfb, ceafbd, ceafdb, cebdaf, cebdfa,
cebfad, cebfda, cefadb, cefbda, cfadbe, cfaebd,
cfbdae, cfbead, cfdaeb, cfdbea, cfeadb, cfebda,
daebfc, daecfb, dafbec, dafceb, dbeafc, dbecfa,
dbfaec, dbfcea, dceafb, dcebfa, dcfaeb, dcfbea,
eadbfc, eadcfb, eafbdc, eafcdb, ebdafc, ebdcfa,
ebfadc, ebfcda, ecdafb, ecdbfa, ecfadb, ecfbda,
fadbec, fadceb, faebdc, faecdb, fbdaec, fbdcea,
fbeadc, fbecda, fcdaeb, fcdbea, fceadb, fcebda,
total = 120
附: fortran 代码在线编译运行的截图