// filename: main.cpp // title: swap & complete permutation // time: 2011/3/29 #include <iostream> using std::cin; using std::cout; using std::endl; #include <cassert> void swap(int& a,int& b) { assert(&a != &b); // 否则a会被置0 a = a + b; b = a - b; a = a - b; } void perm(int data[],int n,int k) { if( k == n) { for(int i = 1; i <= n; i++) { cout << data[i]; } cout << endl; } else { // k_th // data[k]在原位 perm(data,n,k+1); // data[k]与后面的数交换 for(int j=k+1;j<=n;j++) { swap(data[k],data[j]); perm(data,n,k+1); // 递归,使用k+1,不使用用k++,否则会修改k ☆ swap(data[k],data[j]); // 还原,进行下一个交换 } } } int main(int argc, char* argv[]) { unsigned int n; cin >> n; int* data = new int[n+1]; // 初始化,data[0]不使用 for(int i = 1; i <= n; i++) { data[i] = i; } perm(data,n,1); return 0; }