pascal全排列算法,急!!!急!!!

来源:百度知道 编辑:UC知道 时间:2024/06/23 01:30:28
有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

简单回溯:
这个代码是我刚编的,通过了:
const max=9;
var m,n :longint;
a:array[1..max] of longint;
procedure work(j,k:longint);//j 为枚举第j个数字,k 为上次的枚举值
var i :longint;
begin
if j=m+1 then
begin
for i:=1 to m-1 do write(a[i],' ');//输出
writeln(a[m]);
end
else
for i:=k+1 to n-m+j do//第 i 个的范围是如此,k+1好理解,n-m+j可以通过数学方法证明。例 8 3,则第一个最大范围是1~6,第二个是2~7,3~8,如此
begin
a[j]:=i;
work(j+1,i);//回溯
end;
end;

begin
readln(n,m);
work(1,0);
end.

应该能看懂!!

program xy;
var
n,i,k,j:integer;
a:array[0..100]of integer;
b:array[0..100]of boolean;

procedure find(k:integer);
var j:integer;
begin
if k=n+1 then begin writeln;for i:=1 to n do write(a[i],' ');
end ;
for j:=1 to n do
begin
if b