LRJ小白书上的例题,回溯法。
不过这里需要注意奇偶性。
因为要求相邻之和为奇数,所以只能奇偶间隔。
当n为奇数时,必定有两个奇数相邻,不满足条件,这时候就不用DFS了。不然就超时。
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n;
int vis[30];
int isp[50];
int A[30];
bool flag;
int IsPrime(int n)
{
for (int i = 2; i <= (int)sqrt(n); i++)
if (!(n % i))
return 0;
return 1;
}
void DFS(int cur)
{
if (cur == n && isp[A[0] + A[n - 1]])
{
flag = true;
printf("1");
for (int i = 1; i < n; i++)
printf(" %d", A[i]);
printf("\n");
}
else
{
for (int i = 2; i <= n; i++)
if (!vis[i] && isp[i + A[cur - 1]])
{
A[cur] = i;
vis[i] = 1;
DFS(cur + 1);
vis[i] = 0;
}
}
}
int main()
{
int cnt = 1;
for (int i = 2; i <= 50; i++)
isp[i] = IsPrime(i);
A[0] = 1;
while (scanf("%d", &n) && n)
{
flag = false;
printf("Case %d:\n", cnt++);
if (n == 1)
{
printf("1\n");
continue;
}
if (n & 1)
{
printf("No Answer\n");
continue;
}
memset(vis, 0, sizeof(vis));
DFS(1);
if (!flag)
printf("No Answer\n");
}
return 0;
}