HDU 1016 Prime Ring Problem
简单回溯法
注意:回溯法搜索全空间可不清vis数组
const int N=25;
int a[N];
bool vis[N];
int n;
bool isprime(int x)
{
for(int i=2;i*i<=x;i++)
if(x % i == 0)
return false;
return true;
}
void dfs(int u)
{
if(u == n)
{
if(isprime(a[u-1]+a[0]))
{
cout<<a[0];
for(int i=1;i<n;i++)
cout<<' '<<a[i];
cout<<endl;
}
}
for(int i=2;i<=n;i++)
if(!vis[i] && isprime(i+a[u-1]))
{
vis[i]=true;
a[u]=i;
dfs(u+1);
vis[i]=false;
}
}
int main()
{
int kase=1;
while(cin>>n)
{
//回溯法搜索全空间可不清vis数组
//memset(vis,0,sizeof vis);
a[0]=1;
printf("Case %d:\n",kase++);
dfs(1);
cout<<endl;
}
//system("pause");
}