题目大意:输入整数n,将整数1~n组成一个环,使得相邻俩数之和是素数
解题思路:先列出素数表,然后回溯查看是否满足条件
#include <cstdio>
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
int n;
int flag[20];
int num[20];
int flag2[50];
int is_prime(int n) {
for(int i = 2; i <= (int)sqrt(n); i++) {
if(n % i == 0)
return 0;
}
return 1;
}
void find(int x) {
if(x == n) {
int p = num[1] + num[n];
if(flag2[p] == 0)
return;
for(int i = 1; i < n; i++)
cout << num[i] << " ";
cout << num[n] << endl;
return;
}
for(int i = 2; i <= n; i++) {
if(flag[i] == 0 && flag2[i+num[x]]) {
flag[i] = 1;
num[x+1] = i;
find(x+1);
flag[i] = 0;
}
}
}
int main() {
memset(flag, 0, sizeof(flag));
int count = 0;
for ( int i = 1 ; i < 32 ; ++ i )
flag2[i] = is_prime(i);
while(scanf("%d", &n) != EOF) {
count++;
if(count != 1)
cout << endl;
printf("Case %d:\n", count);
num[1] = 1;
flag[1] = 1;
find(1);
}
return 0;
}