输出前M个字母中任取N个的所有组合情况

[题目描述]
输入两个数M 和 N ,M>=N ,1<=M<=10,按字典序输出组合情况
[输入样例]
4 2
[输出样例]
AB
AC
AD
BC
BD
CD
[思路]
此题和棋盘问题较为相似,都可以用搜索解决,重点在于每一个值范围的确定比较难
[参考程序]

var a,b:array[1..50000]of longint;
    v:array[1..50000]of boolean;
    num,sum,i,j,k,l,m,n,leave:longint;
procedure print;
var i,j:longint;
begin
for i:=1 to num-1 do
  write(chr(b[i]));
writeln(chr(b[num]));
end;
procedure dfs(k:longint);
var i,j:longint;
begin
  if v[k] then
   begin
     v[k]:=false;
     sum:=sum+1;
     b[sum]:=64+k;
     dec(leave);
     if sum=num then
       print
       else
     for i:=k+1 to n-leave+1 do
        dfs(i);
     v[k]:=true;
     sum:=sum-1;
     leave:=leave+1;
    end;
end;
begin
  readln(n,num);
  leave:=num;
  fillchar(a,sizeof(a),0);
  fillchar(b,sizeof(b),40);
  fillchar(v,sizeof(v),true);
  sum:=0;
  for i:= 1 to n-leave+1 do
    dfs(i);
end.
阅读更多
个人分类: 搜索
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

输出前M个字母中任取N个的所有组合情况

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭