去看了一下Dancing Links发现。。这东西貌似我以前想到过。。。 没想到以前一直以为很吊的东西原来是这个。。。
(也许是自己没有完全理解?
然后我用这个打了一下全排列。。(勿喷
发现这个和暴力差不了多少呀。。。(勿喷
DLX
#include<cstdio> #include<iostream> #include<cstring> using namespace std; //Dancing Link char c; inline void read(int &a) { a=0;do c=getchar();while(c<'0'||c>'9'); while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar(); } int L[101],R[101]; int S[101]; int n; inline void P(int x) { if(x<10){putchar('0'+x);return ;} int base=1; while(base<=x)base=(base<<1)+(base<<3); base/=10; while(base)putchar('0'+x/base),x%=base,base/=10; } inline void print() { for(int i=1;i<=n;i++) P(S[i]); puts(""); } int solve(int x) { if(!R[0]) print(); for(int j=R[0];j;j=R[j]) { R[L[j]]=R[j]; L[R[j]]=L[j]; S[x]=j; solve(x+1); R[L[j]]=j; L[R[j]]=j; } } int main() { freopen(".out","w",stdout); //read(n); n=11; for(int i=1;i<=n;i++) R[i]=i+1,L[i]=i-1; R[n]=0; L[0]=0; R[0]=1; solve(1); return 0; }暴力
#include<cstdio> #include<iostream> #include<cstring> using namespace std; char c; inline void read(int &a) { a=0;do c=getchar();while(c<'0'||c>'9'); while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar(); } int L[101],R[101]; int S[101]; int n; inline void P(int x) { if(x<10){putchar('0'+x);return ;} int base=1; while(base<=x)base=(base<<1)+(base<<3); base/=10; while(base)putchar('0'+x/base),x%=base,base/=10; } inline void print() { for(int i=1;i<=n;i++) P(S[i]); puts(""); } bool use[100001]; int solve(int x) { if(x==n+1) print(); for(int i=1;i<=n;i++) if(!use[i]) { use[i]=true; S[x]=i; solve(x+1); use[i]=false; } } int main() { freopen(".out","w",stdout); //read(n); n=11; for(int i=1;i<=n;i++) R[i]=i+1,L[i]=i-1; R[n]=0; L[0]=0; R[0]=1; solve(1); return 0; }