数字排列问题(pascal-回溯法)

来源:百度知道 编辑:UC知道 时间:2024/09/28 10:15:26
样例输入:3
样例输出:1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
这是我的程序:program p1_1;
const n=3;
var a:array[1..n] of integer;
i:integer;

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

begin
for i:=1 to n do
begin
a[1]:=i;
find(2)
end
end.
可以通过编译,可是结果错误。

1. 建议不要用const,
在主程序上readln(n);
2. a[1]:=i;
这里是错的,应该是a[i]:=i;你写成了a[1]
3. for i:=1 to n do
begin
a[1]:=i;
find(2)
end
这里find(2),不要放在循环里面,正确的是
for i:=1 to n do
begin
a[1]:=i;

end
find(1);

4.建一个数组判断I是否重复
b:array[1..100]of boolean;
刚开始所有的I都是false fillchar(b,sizeof(b),false);

5. for i:=1 to n do
for j:=1 to k-1 do
begin
if i<>a[j] then begin
a[k]:=i;
find(k+1)
end
end
然后这里就改成
for i:=1 to n do
begin
if b[i]=false then begin
b[i]:=true{I用了,就定义true}
a[k]:=i;
find(k+1);{继续往下}
b[i]:=false;{回溯,回溯,找不到结果还是要回来的!!!记住,还要回来。}
end

还有不明白的再问。