主题: Prime Ring
查看单个帖子
  #4 (permalink)  
旧 2008-04-03
medie2005 medie2005 当前离线
初级会员
 
注册日期: 2008-04-03
帖子: 1
medie2005 正向着好的方向发展
默认 回复: Prime Ring

利用限制排列生成算法解决这个问题,没有考虑到剔除对称模式,在n<=14时速度还可以。
#include <iostream>
#include <iterator>
#include <windows.h>

using namespace std;

int Prime[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,
0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0};

void f( int n ){
int *a=new int[n+1], *l=new int[n+1], *u=new int[n+1];
int k, p, q;
for( k=0; k<n; ++k ) l[k]=k+1;
l[n]=0;
k=1;
X2: p=0; q=l[0];
X3: a[k]=q;
if( !( k==1 || Prime[a[k-1]+a[k]] ) )
goto X5;
else
if( k==n ){
copy( a+1, a+n+1, ostream_iterator<int>(cout," ") ),cout<<endl;
goto X6;
}
u[k]=p; l[p]=l[q]; ++k; goto X2;
X5: p=q; q=l[p]; if( q!=0 ) goto X3;
X6: --k;
if( k==0 ) return;
p=u[k], q=a[k], l[p]=q;
goto X5;
delete []a; delete []u; delete []l;
}

int main( )
{
int n;
cin>>n;
f( n );
return 0;
}
回复时引用此帖