pascal 回溯法题目 〔急〕

来源:百度知道 编辑:UC知道 时间:2024/06/14 18:09:51
输入N,N是1~9的任意整数
然后输入一个由1~N组成的数
例如:N=5
13452
用回溯法找出它在N位数组合里的第几个
如3的排列里
顺序为123 132 213 231 312 321
所以132就是第2个

检查过了没有错误...
要用的时候在写字板里替换一下 . 就可以了

program.xx;
var
..i,n:1..10;
..se:set.of.1..10;
..total,w:integer;
..s,q:array[1..10].of.integer;
..find:boolean;

procedure.run(i:integer);
..var
....j:integer;
..begin
.....if.i=n+1.then {约束条件}
........begin
..........for.j:=1.to.n.do.write(s[j]:3);{打印}
..........inc(total);{总数}
..........writeln;
..........find:=true;{这个就是核对,如果找到就true 不然是false 看下面就知道}
..........for.j:=1.to.n.do
.............begin
...............if.s[j]<>q[j].then.find:=false;
...............if.find.then.w:=total;
.............end;
..........se:=se-[s[j]];{集合,用来看是不是重复了}
..........exit;
........end;
.....for.j:=1.to.n.do{算符,就是一个个回溯}
........begin
..........if.not(j.in.se)then{判断是不是在里面}
............begin
..............se:=se+[j];
..............s[i]:=j;
..............run(i+1);
..............se:=se-[