Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCPERMU/
1. Đề bài Liệt kê hoán vị
Liệt kê hoán vị của n phần tử của một tập gồm các số từ 1->n.
Input
Dòng duy nhất chứa số n (1<=n<=8)
Output
Các hoán vị sắp xếp theo thứ tự từ điển tăng dần.
Example
Input:
3
Output:
123
132
213
231
312
321
2. Code Liệt kê hoán vị pascal c++
a. code pascal BCPERMU
const nmax=8; type data = byte; var n:data; dd:array[1..nmax] of boolean; res:array[1..nmax]of data; procedure xuat; var i:data; begin for i:=1 to n do write(res[i]); writeln; end; procedure try(i:data); var j:data; begin if i>n then xuat else for j:=1 to n do if not dd[j] then begin dd[j]:=true; res[i]:=j; try(i+1); dd[j]:=false; end; end; begin readln(n); fillchar(dd,sizeof(dd),false); try(1); end.
b. code c++ BCPERMU
#include <stdio.h> using namespace std; #define nmax=8; int n; bool dd[10]; int res[10]; void xuat() { int i; for (i=1; i<=n; i++) printf("%d",res[i]); printf("\n"); } void dequy(int i) { int j; if (i>n) { xuat(); } else { for (j=1; j<=n; j++) { if (dd[j]==false) { dd[j]=true; res[i]=j; dequy(i+1); dd[j]=false; } } } } int main() { scanf("%d",&n); int i; for (i=1; i<=3; i++) dd[i]=false; dequy(1); return 0; }