原题链接:https://vjudge.net/problem/UVA-524
分类:回溯法
备注:回溯法和生成-测试法的比较
备注是紫书上的,因为生成-测试法即纯枚举,是行不通的,作者对其进行了一下比较。
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int ans[20] = { 1 }, vised[20], isp[40], n, kase;
bool isPrime(int x) {
if (x == 1)return false;
int limit = x / 2 + 1;
for (int i = 2; i < limit; i++)
if (x % i == 0)return false;
return true;
}
void dfs(int pos) {
if (pos >= n) {
for (int i = 0; i < n; i++)
printf("%d%c", ans[i], i == n - 1 ? '\n' : ' ');
return;
}
for (int i = 2; i <= n; i++)
if (!vised[i]) {
if (!isp[ans[pos - 1] + i])continue;
if (pos == n - 1 && !isp[i + 1])continue;
ans[pos] = i;
vised[i] = 1;
dfs(pos + 1);
vised[i] = 0;
}
}
int main(void) {
for (int i = 0; i <= 40; i++)
if (isPrime(i))isp[i] = 1;
while (~scanf("%d", &n)) {
if (kase)printf("\n");
printf("Case %d:\n", ++kase);
dfs(1);
}
return 0;
}