PASCAL递归的简单题目,有重复元素的排列问题

输入样例4aacc输出样例aaccacacaccacaaccacaccaa6简单化了题目,但是应该看的明白,小弟指教了~... 输入样例
4
aacc
输出样例
aacc
acac
acca
caac
caca
ccaa
6
简单化了题目,但是应该看的明白,小弟指教了~
展开
 我来答
忆可棠
2009-02-06 · 超过17用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:37.7万
展开全部
以下程序过了提供的样例,其中子程序中的hash是用来判重的,就是防止比如说aacc出现两次这样的问题,另外数组只开到100,你如果需要可以开更大,程序有看不懂的再发小纸条问好了
var a,b:array [0..100] of char;
used:array [0..100] of boolean;
i,n,total:longint;

procedure print;
var i:longint;
begin
for i:=1 to n-1 do write(a[i]);
writeln(a[n]);
inc(total);
end;

procedure search(k:longint);
var i:longint;
hash:array ['a'..'z'] of boolean;
begin
if k>n then print
else begin
fillchar(hash,sizeof(hash),false);
for i:=1 to n do
if (not(used[i])) and (not(hash[b[i]])) then begin
a[k]:=b[i];
hash[b[i]]:=true;
used[i]:=true;
search(k+1);
used[i]:=false;
end;
end;
end;

begin
readln(n);
for i:=1 to n do
begin
read(b[i]);
a[i]:=a[i];
end;
total:=0;
fillchar(used,sizeof(used),false);
search(1);
writeln(total);
end.
192_168_2_13
2009-02-07 · TA获得超过112个赞
知道小有建树答主
回答量:121
采纳率:0%
帮助的人:0
展开全部
这个算法不知道对不对:
1.把元素(n个)从小到大排列
2.从n往前找,找到第一个i,满足a[i]<a[i+1]
3.从n往前找,找到第一个j,满足a[j]>a[i]
4.交换a[i],a[j]
5.将数组中i+1到n位置的数据从小到大排列,即可生成下一种排列
6.重复2至6步,知道找不到满足条件的i为止

PS:这是无重复元素的全排列算法,对有重复元素的好像也适用,不会生成重复的情况。

例:设当前排列为acca;
则i=1 (a[1]='a',a[2]='c','a'<'c')
j=3 (a[1]='a',a[3]='c','a'<'c')
交换a[i],a[j]后为ccaa
将a[i+1]至a[n],即a[2]至a[4]从小到大排列,得caac
caac就是下一个排列
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xm蔡淳
2012-06-08
知道答主
回答量:34
采纳率:0%
帮助的人:26.4万
展开全部
var
r:array[1..500]of char;
temp:char;
n,i,j,tot:integer;

procedure print;
var
i:integer;
begin
for i:=1 to n do write(r[i]);
inc(tot);
writeln;
end;

procedure work(l:integer);
var
i:integer;
a:array[32..127]of boolean;
begin
fillchar(a,sizeof(a),false);
if l=n then begin print;exit;end;
work(l+1);
a[ord(r[l])]:=true;
for i:=l+1 to n do
IF ((r[l]=r[i])and(i<>l))or a[ord(r[i])] then continue else
begin
temp:=r[l];
r[l]:=r[i];
r[i]:=temp;
a[ord(r[l])]:=true;
work(l+1);
temp:=r[i];
r[i]:=r[l];
r[l]:=temp;
end;
end;

begin
readln(n);
for i:=1 to n do read(r[i]);
work(1);
writeln('total:',tot);
end.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者HXtUNK4Ohe
2020-06-07 · TA获得超过3948个赞
知道大有可为答主
回答量:3103
采纳率:27%
帮助的人:187万
展开全部
以下程序过了提供的样例,其中子程序中的hash是用来判重的,就是防止比如说aacc出现两次这样的问题,另外数组只开到100,你如果需要可以开更大,程序有看不懂的再发小纸条问好了
var
a,b:array
[0..100]
of
char;
used:array
[0..100]
of
boolean;
i,n,total:longint;
procedure
print;
var
i:longint;
begin
for
i:=1
to
n-1
do
write(a[i]);
writeln(a[n]);
inc(total);
end;
procedure
search(k:longint);
var
i:longint;
hash:array
['a'..'z']
of
boolean;
begin
if
k>n
then
print
else
begin
fillchar(hash,sizeof(hash),false);
for
i:=1
to
n
do
if
(not(used[i]))
and
(not(hash[b[i]]))
then
begin
a[k]:=b[i];
hash[b[i]]:=true;
used[i]:=true;
search(k+1);
used[i]:=false;
end;
end;
end;
begin
readln(n);
for
i:=1
to
n
do
begin
read(b[i]);
a[i]:=a[i];
end;
total:=0;
fillchar(used,sizeof(used),false);
search(1);
writeln(total);
end.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式