题意:给定一个数,输出该数能够形成的素数环的所有方案。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
思路:dfs递归实现,三个数组,一个存环的每个位置的数,一个判定该数是否被取过,一个判定该数与前一位相加是否为素数。
代码:
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int natural[100];
int vis[100];
int isprime[100];
int n;
void prime()
{
isprime[1] = isprime[2]= 1;
for(int i=3; i<=2*n; i++)
{
int flag = 0;
for(int j=2; j<=2*n; j++)
{
if(i%j == 0 && i!= j)
flag = 1;
if(j>i)
break;
}
if(!flag)
isprime[i] = 1;
}
}
void dfs(int x)
{
if(x == n+1 && isprime[natural[1]+natural[n]])
{
cout << 1;
for(int i=2; i<=n; i++)
cout << " " << natural[i];
cout << endl;
return ;
}
for(int i=2; i<=n; i++)
{
if(!vis[i] && isprime[natural[x-1] + i])
{
vis[i] = 1;
natural[x] = i;
dfs(x+1);
vis[i] = 0;
}
}
}
int main()
{
int cnt=0;
while(cin >> n)
{
cout << "Case " << ++cnt << ":" << endl;
memset(isprime, 0,sizeof isprime);
memset(natural, 0,sizeof natural);
memset(vis, 0,sizeof vis);
prime();
natural[1] = 1;
dfs(2);
cout << endl;
}
return 0;
}