标签:
Problem Description
#include <iostream>
#include<string.h>
using namespace std;
int a[25];
bool vis[25];
int n;
//输出组合好的数组
void output(){
for(int i = 1;i <= n;i++){
if(i==n)
cout << a[i] << endl;
else
cout << a[i] << " ";
}
}
//判断一个数是不是素数
bool prime(int num){
if(num == 1)return false;
if(num == 2 || num == 3)return true;
int i;
for(i=2;i<num;i++)
if(num%i==0)
return false;
return true;
}
void dfs(int t){
//如果输入的数是奇数,则不可能实现两两相加
if(n & 1){
return;
}
// cout << t << " " << a[t] << endl;
//递归到第n+1层,则意味递归完了所有数
if(t == n+1){
if(prime(a[1]+a[n])){
output();
}
}
else{
for(int i = 2;i <= n;i++){
if(!vis[i] && prime(a[t-1]+i)){//如果符合两个数之和为素数且该数在之前没有访问过
a[t] = i;
vis[i] = true;
dfs(t+1);
//如果算法返回,进行回溯
vis[i] = false;
}
}
}
}
int main()
{
int k = 1;
while(cin >> n){
//注意输出格式,否则过不了
memset(vis,false,sizeof(vis));
memset(a,0,sizeof(a));
cout << "Case " << k << ":" << endl;
k ++;
a[1] = 1;
vis[1] = true;
dfs(2);//默认了从1开始,那么1为第一层,深搜则从第二层开始
cout << endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/2016zhanggang/p/5425945.html