有重复元素的排列问题pascal题解
生活随笔
收集整理的這篇文章主要介紹了
有重复元素的排列问题pascal题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
var
l,i,tj:longint;
a:array['a'..'z']of longint;
x,c:char;
b:array[0..500]of char;
procedure print;
begin
? ? for i:=1 to l do//要一個一個輸出,不能直接write(b),不然就輸出不出來
? ? write(b[i]);
? ? writeln;//換行
? ? inc(tj);
end;
procedure search(x:char;dep:longint);//dep是當前要填的位置
var
i:char;
begin
? ? if dep>l then//如果填的位置大于長度那么就輸出
? ? begin
? ? ? ? print;
? ? ? ? exit;
? ? end;
? ? for i:=x to 'z' do
? ? if a[i]>0 then//如果i字符還有沒填的話,就回溯
? ? begin
? ? ? ? b[dep]:=i;//填數
? ? ? ? dec(a[i]);//i字符的數量-1
? ? ? ? if a[x]>0 then search(x,dep+1) else search(chr(ord(x)+1),dep+1);//如果x字符在原串中還有出現次數就繼續搜
? ? ? ? inc(a[i]);//回溯
? ? end;
end;
begin
? ? readln(l);// l個元素,也是排列的長度
? ? for i:=1 to l do
? ? begin
? ? ? ? read(x);
? ? ? ? inc(a[x]);//統計每個元素有幾個
? ? end;
? ? tj:=0;//tj是排列總數
? ? c:='a';
? ? while a[c]=0 do c:=chr(ord(c)+1);//找到原串中第一個在26個字母中出現的字符
? ? search(c,1);//搜索
? ? write(tj);//輸出數量
end.
l,i,tj:longint;
a:array['a'..'z']of longint;
x,c:char;
b:array[0..500]of char;
procedure print;
begin
? ? for i:=1 to l do//要一個一個輸出,不能直接write(b),不然就輸出不出來
? ? write(b[i]);
? ? writeln;//換行
? ? inc(tj);
end;
procedure search(x:char;dep:longint);//dep是當前要填的位置
var
i:char;
begin
? ? if dep>l then//如果填的位置大于長度那么就輸出
? ? begin
? ? ? ? print;
? ? ? ? exit;
? ? end;
? ? for i:=x to 'z' do
? ? if a[i]>0 then//如果i字符還有沒填的話,就回溯
? ? begin
? ? ? ? b[dep]:=i;//填數
? ? ? ? dec(a[i]);//i字符的數量-1
? ? ? ? if a[x]>0 then search(x,dep+1) else search(chr(ord(x)+1),dep+1);//如果x字符在原串中還有出現次數就繼續搜
? ? ? ? inc(a[i]);//回溯
? ? end;
end;
begin
? ? readln(l);// l個元素,也是排列的長度
? ? for i:=1 to l do
? ? begin
? ? ? ? read(x);
? ? ? ? inc(a[x]);//統計每個元素有幾個
? ? end;
? ? tj:=0;//tj是排列總數
? ? c:='a';
? ? while a[c]=0 do c:=chr(ord(c)+1);//找到原串中第一個在26個字母中出現的字符
? ? search(c,1);//搜索
? ? write(tj);//輸出數量
end.
轉載于:https://www.cnblogs.com/YYC-0304/p/9500259.html
總結
以上是生活随笔為你收集整理的有重复元素的排列问题pascal题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全排列问题pascal解题程序
- 下一篇: 三连击打表程序