HDU(1016),打素数环
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
哈哈,状态来了就是不一样,很快就A了。
注意的位置是,最后一个点,要与第一个点比较。
#include <stdio.h> #include <string.h> int prime[50]= {0}; ///是素数就是0 bool vis[50]; int ans[25]; int n; void dfs(int k) { //printf("%d\n",k); if(k==n+1) { for(int i=1; i<n; i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); return ; } else if(k==n) { for(int i=1; i<=n; i++) { if(!vis[i]&&!prime[ans[k-1]+i]&&!prime[i+ans[1]]) { ans[k] = i; vis[i]=true; dfs(k+1); vis[i] = false; } } } else { for(int i=1; i<=n; i++) { if(!vis[i]&&!prime[ans[k-1]+i]) { ans[k] = i; vis[i]=true; dfs(k+1); vis[i] = false; } } } } int main() { ///打出40个素数来 for(int i=2; i<8; i++) if(!prime[i]) for(int j=i*i; j<50; j+=i) prime[j] = 1; /*for(int i=2; i<=45; i++) { if(!prime[i]) printf("%d ",i); } puts("");*/ int Case = 1; while(scanf("%d",&n)!=EOF) { memset(vis,false,sizeof(vis)); memset(ans,0,sizeof(ans)); printf("Case %d:\n",Case++); ans[1] = 1; vis[1] = true; dfs(2); puts(""); } return 0; }