题目大意:输入n,输出由1~n组成的素数环,素数环要求相邻的两个数的和为素数。环由1开始。
解题思路:dfs,当确认n个数时输出,否则去寻找下一个数,标记,取消。
ac代码:
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int a[20]={1}, n, vis[20], cnt=1;
bool prime(int n)
{
int d = sqrt(n);
for (int i=2; i<=d; i++)
if (n % i == 0)
return 0;
return 1;
}
void dfs(int cur)
{
if (cur == n && prime(a[n-1] + 1) )
for (int i=0; i<n; i++)
printf(i==n-1?"%d\n":"%d ", a[i]);
else
for (int i=2; i<=n; i++)
if (!vis[i] && prime(i + a[cur-1])){
vis[i] = 1;
a[cur] = i;
dfs(cur+1);
vis[i] = 0;
}
}
int main()
{
while (scanf("%d", &n)!=EOF && n){
memset(vis, 0, sizeof(vis));
if (cnt != 1)
printf("\n");
printf("Case %d:\n", cnt++);
dfs(1);
}
return 0;
}