总是不好好审题。总结一下自己不看题容易犯的错:
1.漏掉某个重要条件。如此题的必须为1开头,之前还有一道迷宫题也是。
2.打印格式问题
3.可能是多个样例输入 !!! 在这点上栽了很多次了。
4.不同答案的英文格式问题。
此题是最简单的DFS+素数判断,素数直接照搬之前学习的一个单个素数判断方法,非常强悍~
//hdu1016 单个素数判断+搜索
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int n;
int p[] = {4,2,4,2,4,6,2,6};
int d[22];
int usd[22];
//单个素数判断,直接搬过来的
int prime(int k){
if(k == 1){ //此题不可能为1啦
return 0;
}
if(k == 2||k==3||k==5){
return 1;
}
if(k%2==0||k%3==0||k%5==0){
return 0;
}
int bound = (int)sqrt(k);
//本质还是遍历可能的因数。只是该因数增长按照一定的规律
for(int i = 7;i<=bound;){
for(int j = 0;j<8;j++){
if(k%i==0){
return 0;
}
i+= p[j];
}
if(k%i==0){
return 0;
}
}
return 1;
}
void dfs(int level){
if(level == n){
if(prime(d[n-1]+d[0])){
for(int i = 0;i<n-1;i++){
printf("%d ",d[i]);
}
printf("%d\n",d[n-1]);
}
}
for(int i = 1;i<=n;i++){
if(!usd[i]&&prime(d[level-1]+i)){
usd[i] = 1;
d[level] = i;
dfs(level+1);
usd[i] = 0;
}
}
}
int main(){
int kase = 1;
while(~scanf("%d",&n)){
memset(usd,0,sizeof(usd));
d[0] = usd[1] = 1;
printf("Case %d:\n",kase);
dfs(1);
printf("\n");
kase++;
}
return 0;
}