题目大意:第一个位置为1, 在2到n个位置填入2-n的数, 不能重复(用一个标记数组标记),要求每个数和左右两个数相加为素数
直接暴力深搜搞定,注意每个样例后面要输出换行不然过不了
#include <iostream>
#include <algorithm>
#include <cmath>
#include <set>
#include <vector>
#include <map>
using namespace std;
int n, hashtable[20] = {0}, p[20];//标记数组和结果数组
int isprime(int x){//判断素数
int sqr = sqrt(x);
for(int i = 2; i <= sqr; i++){
if(x % i == 0) return 0;
}
return 1;
}
void dfs(int index){
if(index == n + 1){//选完了n个
if(!isprime(p[n] + p[1])){//如果最后这个和第一个和不为素数退出
return;
}
cout << p[1];
for(int i = 2; i <= n; i++){
cout << " " << p[i];
}
cout << endl;
}
for(int i = 2; i <= n; i++){
if(hashtable[i] == false && isprime(i + p[index - 1])){//i这个数还没选并且i和前面的和为素数
hashtable[i] = 1;//i选过了
p[index] = i;
dfs(index + 1);
hashtable[i] = 0;
}
}
}
int main(int argc, char** argv) {
p[1] = 1;
int cnt = 1;
while(cin >> n){
cout << "Case " << cnt << ":" << endl;
dfs(2);
cnt++;
cout << endl;
}
return 0;
}