hdu1016 Prime Ring Problem
1.筛法打素数表,先进行预处理
2.进行枚举,同时递归的时候标记数组,当找到最后一个数同时第一个数和最后一个数相加也是素数,进行输出。
int visited[21], a[21];
bool is_prime[100];
int n;
void sieve()
{
for (int i = 0; i <= 40; i++)
is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= 40; i++)
{
if (is_prime[i])
{
for (int j = 2 * i; j <= 40; j += i)
is_prime[j] = false;
}
}
}
void dfs(int num)
{
if (num == n && is_prime[a[num] + a[1]])
{
for (int i = 1; i < num; i++)
{
printf("%d ", a[i]);
}
printf("%d\n", a[num]);
}
else
{
for (int i = 2; i <= n; i++)
{
if (visited[i] == 0)
{
if (is_prime[a[num] + i])
{
a[++num] = i;
visited[i] = -1;
dfs(num);
visited[i] = 0;
num--;
}
}
}
}
}
int main()
{
int t = 0;
sieve();
while (scanf("%d", &n) != EOF)
{
t++;
printf("Case %d:\n", t);
memset(visited, 0, sizeof(visited));
memset(a, 0, sizeof(a));
a[1] = 1;
dfs(1);
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号