一道pascal题目排列(permutation)【源程序名】permutation.(pas/cpp)【问题描述】有n个人(1≤n≤9),每个人的编号1,2,...,n;请选出r个人参加一个活动,并排成一队,请输出所有可能.结果按照字典排序.
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/15 00:14:32
一道pascal题目排列(permutation)【源程序名】permutation.(pas/cpp)【问题描述】有n个人(1≤n≤9),每个人的编号1,2,...,n;请选出r个人参加一个活动,并排成一队,请输出所有可能.结果按照字典排序.
一道pascal题目
排列(permutation)
【源程序名】permutation.(pas/cpp)
【问题描述】有n个人(1≤n≤9),每个人的编号1,2,...,n;请选出r个人参加一个活动,并排成一队,请输出所有可能.结果按照字典排序.
【输入数据】输入数据两行,第一行包含一个整数n(1≤n≤9),表示共有n个人,第二行包含一个整数r(1≤r≤n),表示共有r个人参加活动.
【输出数据】输出数据每一种排列占一行,为这r个人的编号,编号之间有一个空格,排列按照字典顺序输出.
【测试样例】
输入
3
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
一道pascal题目排列(permutation)【源程序名】permutation.(pas/cpp)【问题描述】有n个人(1≤n≤9),每个人的编号1,2,...,n;请选出r个人参加一个活动,并排成一队,请输出所有可能.结果按照字典排序.
很简单,用深度优先搜索,我没做优化,当n=9,r=9时,需要一定时间.
var
n,r,k:byte;
f:array [1..9] of boolean;
a:array [1..9] of byte;
procedure permutation(i:byte);
var j:byte;
begin
if i=r+1 then
begin
for k:=1 to r-1 do
write(a[k],' ');
writeln(a[r]);
exit;
end;
for j:=1 to n do
if f[j] then
begin
f[j]:=false;
a[i]:=j;
permutation(i+1);
f[j]:=true;
end;
end;
begin
fillchar(f,sizeof(f),true);
readln(n);
readln(r);
permutation(1);
end.