题意:输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出1次。 n≤16 。(本段摘自《算法竞赛入门经典(第2版)》
分析:回溯直接搞就好了。
代码:
#include <fstream>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <sstream>
#include <string>
#include <map>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <vector>
using namespace std;
const int maxn = 20 + 5;
int n, C;
int a[maxn], v[maxn];
bool is_prime(int x)
{
for (int i = 2; i * i <= x; ++i)
if (x % i == 0)
return false;
return true;
}
void DFS(int deep)
{
if (deep == n)
{
if(is_prime(a[deep - 1] + a[0]))
{
for (int i = 0; i < n; ++i)
if (i < n - 1)
printf("%d ", a[i]);
else
printf("%d\n", a[i]);
}
return;
}
for (int i = 1; i < n; ++i)
{
if (!v[i + 1] && is_prime(a[deep - 1] + i + 1))
{
v[i + 1] = 1;
a[deep] = i + 1;
DFS(deep + 1);
v[i + 1] = 0;
}
}
}
int main()
{
while (~scanf("%d", &n))
{
if (C)
printf("\n");
printf("Case %d:\n", ++C);
a[0] = 1;
DFS(1);
}
return 0;
}