题目链接如下:
开始用next_permutation做的,还觉得好简单,没想到严重超时...这个函数速度很慢。于是按书上代码依样画葫芦写了排列的代码。
AC代码如下:
#include <cstdio>
// #define debug
int n, kase = 0;
int p[16];
bool prime[32];
bool isPrime(int k){
for (int i = 2; i * i <= k; ++i){
if (k % i == 0){
return false;
}
}
return true;
}
void check_perm(int k){
if (k == n){
if (prime[p[n - 2] + p[n - 1]] && prime[p[n - 1] + p[0]]){
for (int i = 0; i < n; ++i){
printf("%d%s", p[i], i == n - 1 ? "\n" : " ");
}
}
} else {
for (int i = 1; i <= n; ++i){
int flag = 1;
for (int j = 0; j < k; ++j){
if (p[j] == i){
flag = 0;
break;
}
}
if (flag && prime[i + p[k - 1]]){
p[k] = i;
check_perm(k + 1);
}
}
}
}
int main(){
#ifdef debug
freopen("0.txt", "r", stdin);
freopen("1.txt", "w", stdout);
#endif
for (int i = 2; i < 32; ++i){
if (isPrime(i)){
prime[i] = true;
}
}
p[0] = 1;
while (scanf("%d", &n) == 1){
printf("%s", kase ? "\n" : "");
printf("Case %d:\n", ++kase);
check_perm(1);
}
#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
用next_permutation严重超时代码如下:
#include <cstdio>
#include <algorithm>
#define debug
int n, kase = 0;
int p[16];
bool prime[32];
bool isPrime(int k){
for (int i = 2; i * i <= k; ++i){
if (k % i == 0){
return false;
}
}
return true;
}
bool judge(){
for (int i = 0; i < n; ++i){
if (!prime[p[i] + p[(i + 1) % n]]){
return false;
}
}
return true;
}
int main(){
#ifdef debug
freopen("0.txt", "r", stdin);
freopen("1.txt", "w", stdout);
#endif
for (int i = 2; i < 32; ++i){
if (isPrime(i)){
prime[i] = true;
}
}
while (scanf("%d", &n) == 1){
printf("%s", kase ? "\n" : "");
printf("Case %d:\n", ++kase);
for (int i = 0; i < n; ++i){
p[i] = i + 1;
}
do {
if (p[0] != 1){
break;
}
if (judge()){
for (int i = 0; i < n; ++i){
printf("%d%s", p[i], i == n - 1 ? "\n" : " ");
}
}
} while (std::next_permutation(p, p + n));
}
#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}