原题链接
这题要先对n进行奇偶数判断,如果是奇数且不为1则NO answer,否则有解,回溯加剪枝解决。
#include <stdio.h>
int n, store[21], Prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43 };
bool hasSelect[21], ok;
bool checkPrime(int k){
for(int i = 0; i < 14; ++i)
if(k == Prime[i]) return 1;
return 0;
}
void backTrack(int k){
if(k == n + 1){
if(checkPrime(store[1] + store[n])){
printf("%d", store[1]);
for(int i = 2; i <= n; ++i) printf(" %d", store[i]);
printf("\n");
ok = 1;
}
return;
}
for(int i = 2; i <= n; ++i){
if(!hasSelect[i] && checkPrime(i + store[k - 1])){
hasSelect[i] = 1;
store[k] = i;
backTrack(k + 1);
hasSelect[i] = 0;
}
}
}
int main(){
int i = 1;
while(scanf("%d", &n), n){
printf("Case %d:\n", i++);
if(n & 1){
if(n == 1) printf("1\n");
else printf("No Answer\n");
continue;
}
ok = 0;
store[1] = 1;
backTrack(2);
if(!ok) printf("No Answer\n");
}
return 0;
}