1. 程式人生 > >hdu 1016 素數環 深搜,回溯

hdu 1016 素數環 深搜,回溯

#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");
    }
}