pascal全排列演算法,急急

時間 2022-07-20 00:09:09

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]);

endelse

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.

應該能看懂!!

2樓:匿名使用者

program xy;

varn,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[j] then

begin

b[j]:=false;

a[k]:=j;

find(k+1);

b[j]:=true;

end;

end;

end;

begin

readln(n);

fillchar(b,sizeof(b),true);

fillchar(a,sizeof(a),0);

find(1);

readln;

end.

3樓:匿名使用者

這個是全排列的變式,和全排列很像,我直接給你寫一下。

procedure try(d:integer);

var i,j,k:integer;

begin

if d=n+1 then

begin

for i:=1 to n do

write(a[i]);

end else

begin

for i:=1 to m do

if bj[i]=false then

begin

bj[i]:=true;

a[n]:=i;

try(n+1);

bj[i]:=false;

end;

end;

end;

read(m,n);

try(1);

這個幾乎是偽**,看看差不多

bj是判重,a是daan

4樓:匿名使用者

program e;

varn,t:longint;

a:array[1..8] of integer;

flag:array[1..8] of boolean;

procedure search(depth:integer);

vari:integer;

begin

if(depth>n) then

begin

for i:=1 to n do write(a〔i〕:4);

writeln;

inc(t);

exit;

end;

for i:=1 to n do

if flag〔i〕=false thenbegin

a[depth]:=i;

flag〔i〕:=true;

search(depth+1);

flag〔i〕:=false;

end;

end;

begin

read(n);

t:=0;

fillchar(flag,sizeof(flag),false);

search(1);

writeln('total=',t);

end.

vara : array [1..10000] of longint;

n, m, i, k, e, t : longint;

begin

readln(n);

readln(m);

for i:=1 to n do

read(a[i]);

for m:=m downto 1 do begink := n;

while a[k-1] > a[k] dodec(k);

e := n;

while a[k-1] > a[e] dodec(e);

t := a[k-1];

a[k-1] := a[e];

a[e] := t;

e := n;

while k < e do begin

t := a[k];

a[k] := a[e];

a[e] := t;

inc(k);

dec(e);

endend;

for i:=1 to n-1 do

write(a[i], ' ');

writeln(a[n]) ;

end.

Pascal習題 求N個數的全排列

var a array 1.100 of longint n longint b array 1.100 of boolean procedure f sum longint var j longint begin if sum n then begin for j 1 to n do write ...

全排列問題

這個 有問題,修改一下 void perm int list,int k,int m else 這樣才能求出非3位陣列的全排列 思路 假設n個數的全排列是perm list,1,n 即從第1個開始到第n個數的全排列,那麼它的解可以劃分為子問題 當第一位確定是某個數的時候,其餘數的全排列。假設第一位確...

數字排列的問題!請教,C語言數字全排列的問題(急!!)求C程式碼和演算法

解肯定不唯一了,我隨便想乙個 每組20行,每行的0 9出現頻率相同 第一組000,111,222,333,444,999001,112,223,334,445,990002,113,224,335,446,991.019,120,231,342,453,908第二組 020,131,242,353,...

包門套全包怎樣算,包門套全包怎樣算價格

首先你要算出門套材料多少錢,再加上你需要用的輔料以及門套簡易程度 根據你自己的效率一天能做多少,以及其他費用,根據這些元素來算。包門套全包怎樣算 首先門套全包有二個部分,一門套裡面的木板 一張板可以做多少個門套,板子成本,以及一些木板輔料的費用,二根據要求不鏽鋼一張板可以做多少個門套,如果尺寸合適材...

從1 5全排列,有多少種方法?要詳細排法。給20分

共有5 4 3 2 1 120種排法.具體排法 12345 12354 12435 12453 1253412543 13245 13254 13425 1345213524 13542 14235 14253 1432514352 14523 14532 15234 1524315324 1534...