hdu 1016 素數環 深搜,回溯
阿新 • • 發佈:2019-01-31
#include<iostream> using namespace std; #include<cstdio> #include<cmath> #include<cstring> int n,a[23],vis[23],Case=0; bool isp(int n){ for(int i=2;i<=sqrt(n);i++) if(n%i==0) return 0; return 1; } void dfs(int cur){ if(cur==n&&isp(a[0]+a[n-1])){//遞迴邊界,別忘了測試第一個數和最後一個數 for(int i=0;i<n-1;i++)//列印方案 printf("%d ",a[i]); printf("%d",a[n-1]); printf("\n"); } else for(int i=2;i<=n;i++)//嘗試放置每個i if(!vis[i]&&isp(i+a[cur-1])){//如果i沒有用過,並且與前一個數之和為素數 a[cur]=i; vis[i]=1;//設定使用標誌 dfs(cur+1); vis[i]=0;//清除標誌 } } int main(){ while(++Case&&cin>>n&&n){ printf("Case %d:\n",Case); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) a[i]=i+1; dfs(1); printf("\n"); } }