6人排成一排,abc不相邻,de也不相邻,有多少种排法?

有 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 代码在线编译运行的截图
在这里插入图片描述

### 字符串按字典序排序的方法 对于字符串类型的字典序排序,可以通过编程语言中的内置函数或方法实现。以下是基于 Python 的解决方案: ```python def sort_string(s): # 将字符串转换为字符列表 char_list = list(s) # 对字符列表进行排序 char_list.sort() # 使用内置的 sort 方法对字符按字典序排序[^1] # 将排序后的字符列表重新组合为字符串 sorted_string = ''.join(char_list) return sorted_string # 示例 input_string = "acb" output_string = sort_string(input_string) print(output_string) # 输出结果为 abc ``` 上述代码通过以下步骤实现了字符串的字典序排序: - 首先将字符串转换为字符列表。 - 使用 `sort()` 方法对字符列表进行排序,该方法默认按照字典序排列[^2]。 - 最后将排序后的字符列表重新组合为字符串。 如果需要在其他编程语言中实现类似功能,可以参考相应的字符串和数组操作方法。例如,在 C++ 中可以使用 `std::sort` 函数对字符串进行排序[^3]。 ### C++ 示例代码 ```cpp #include <iostream> #include <algorithm> using namespace std; string sort_string(string s) { sort(s.begin(), s.end()); // 使用 std::sort 对字符串按字典序排序 return s; } int main() { string input_string = "acb"; string output_string = sort_string(input_string); cout << output_string << endl; // 输出结果为 abc return 0; } ``` ### 注意事项 - 字符串的字典序排序依赖于字符的 ASCII 值。例如,大写字母 `'A'` 到 `'Z'` 的 ASCII 值小于小写字母 `'a'` 到 `'z'` 的 ASCII 值[^4]。 - 如果输入字符串包含重复字符,排序后的字符串会保留这些重复字符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值