hdu1016 Prime Ring Problem(回溯dfs)

来源:互联网 发布:hse培训矩阵 编辑:程序博客网 时间:2024/05/29 08:15

本题是回溯,遍历过程就好像一棵树,需要点想象力哈~,一旦树到了尾部即输出,而且输出后并不清空,回溯后继续寻找其他解并输出。

注意本题说的是相邻数的和是素数,并不是每个数都是素数。

还有网上发现个效率特高的素数打表法,分享下咯!

#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;const int N = 30;const int INF = 1000000;int vis[N], a[N], prime[50];int n;void prime_table()//高速打表{    memset(prime, 1, sizeof(prime));    for(int i = 2; i < 50; i ++)        if(prime[i])        {            for(int j = i + i; j < 50; j += i)                prime[j] = 0;        }}void dfs(int x, int cnt){    vis[x] = 1;    if(cnt == n && prime[a[0] + a[cnt - 1]])    {        printf("%d", a[0]);        for(int i = 1; i < n; i ++)            printf(" %d", a[i]);        printf("\n");    }    for(int i = 1; i <= n; i ++)    {        if(!vis[i] && prime[a[cnt - 1] + i])        {            a[cnt] = i;            dfs(i, cnt + 1);            vis[i] = 0;        }    }}int main(){  //  freopen("in.txt", "r", stdin);    int Case = 1;    prime_table();    while(~scanf("%d", &n))    {        printf("Case %d:\n", Case ++);        memset(vis, 0, sizeof(vis));        memset(a, 0, sizeof(a));        a[0] = 1;        dfs(1, 1);        printf("\n");    }}


0 0