HDU1016 Prime Ring Problem(搜索,DFS)

题目链接

分析:

先求出素数表。再DFS。

#include <stdio.h>
#include <string.h>

#define MAXN 21

int isp[MAXN+MAXN], num[MAXN], n, vis[MAXN], cnt;

void prime(){
    int i, j;
    memset(isp, -1, sizeof(isp));
    isp[0] = isp[1] = 0;
    for(i=2; i<=MAXN+MAXN; i++){
        if(isp[i])
            for(j=i*i; j<=MAXN+MAXN; j += i)
                isp[j] = 0;
    }
}

void dfs(int cur){
    int i;
    if(cur == n && isp[num[0]+num[n-1]]){
        for(i=0; i<n; i++){
            if(i != n-1) printf("%d ", num[i]);
            else printf("%d\n", num[i]);
        }
    }
    else{
        for(i=2; i<=n; i++)if(!vis[i] && isp[num[cur-1]+i]){
            num[cur] = i;
            vis[i] = 1;
            dfs(cur+1);
            vis[i] = 0;
        }
    }
}

int main(){

    prime();

    while(scanf("%d", &n) == 1){
        cnt++;
        memset(vis, 0, sizeof(vis));
        printf("Case %d:\n", cnt);
        vis[1] = 1; num[0] = 1;
        dfs(1);
        putchar('\n');
    }

    return 0;
}
原文地址:https://www.cnblogs.com/tanhehe/p/2932414.html