Dancin Links的理解

去看了一下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;
}


你可能感兴趣的:(Dancin Links的理解)