题意:给你一个偶数N,让你输出一个1到N的排列,这N个数构成一个圆,要求这个圆上所有相邻两个数之和都为素数,输出合法序列。
解法:直接按照题目要求回溯即可。每次模拟放一个合法的数,再看下一次能不能放。直到全放完为止。
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
#define INF 0x3f3f3f3f
#define eps 1e-6
typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 1e9 + 2015;
using namespace std;
int N;
int a[20];
int vis[20];
int prime[] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0};
void dfs(int cur)
{
if(cur == N && prime[a[1] + a[N]])
{
for(int i = 1;i < N;i++)
printf("%d ",a[i]);
printf("%d\n",a[N]);
}
else
{
for(int i = 2;i <= N;i++)
if(!vis[i] && prime[i + a[cur]]){
a[cur + 1] = i;
vis[i] = 1;
dfs(cur + 1);
vis[i] = 0;
}
}
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0);
//freopen("int.txt","r",stdin);
//freopen("out.txt","w",stdout);
int first = 0;
int t = 0;
while(cin >> N)
{
if(first++)
puts("");
printf("Case %d:\n",++t);
memset(vis,0,sizeof(vis));
a[1] = 1;
dfs(1);
}
return 0;
}