题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1457
解题报告:在zoj第一次提交的时候竟然是TLE,让我很是费解,然后把判断素数的方法变成直接打表的方法 ,以为这样可以节省很多的时间,结果还是TLE(hdu上此时就可以Ac),后来试了一下数字19,结果很久都没有跑出结果,感觉应该是这的问题,我就把奇数与偶数分开,结果AC。(感觉杭电的数据弱爆了)
#include<cstdio> #include<cstring> #include<cmath> using namespace std; const int MAX =20+5; int vis[MAX],path[MAX],n; int Isprim[42] = {0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1}; void dfs(int cnt) { if(cnt<=n) { int num=path[cnt]; for(int i=2;i<=n;i++) { if(!vis[i]&&Isprim[i+num]) { path[cnt+1]=i; vis[i]=1; dfs(cnt+1); vis[i]=0; } } } if(cnt==n&&Isprim[path[1]+path[n]]) { for(int i=1;i<n;i++) printf("%d ",path[i]); printf("%d\n",path[n]); } } int main() { int ncase=0; while(scanf("%d",&n)!=EOF) { printf("Case %d:\n",++ncase); memset(vis,0,sizeof(vis)); path[1]=vis[1]=vis[0]=1; if(n%2 == 0)//不判段就是tle dfs(1); printf("\n"); } return 0; }