hdu1016 Prime Ring Problem

一个简单的搜索题目, 从这个问题可以看出, 只要打一个素数表, 然后, 设置一个 该数是否被访问就可以, 一个简单的深搜就可以解决了。

View Code
#include<stdio.h>
#include<math.h>
#include<string.h>
#define maxn 26

int map[maxn], prime[maxn * 2];
int visit[maxn];
int n;

void init()
{
    int i, j;
    memset(prime, 0, sizeof(prime));
    for (i = 3; i < 46; i ++)
    {
        if (prime[i] == 0)
        {
            for (j = i + i; j < 46; j += i)
            {
                prime[j] = 1;
            }
        }
    }
    return;
}

void print()
{
    int i;
    printf("1");
    for (i = 2; i <= n; i ++)
    {
        printf(" %d", map[i]);
    }
    printf("\n");
}

void dfs(int start)
{
    if (start == n )
    {
        if (prime[1 + map[start]] == 0)
        print();
        return;
    }
    int i;
    for (i = 2; i <= n; i ++)
    {
        if (visit[i] == 0 && prime[map[start] + i] == 0)
        {
            visit[i] = 1;
            map[start + 1] = i;
            dfs(start + 1);
            visit[i] = 0;
        }
    }
    return;
}

int main()
{
    init();
    int count = 0;
    while (scanf("%d", &n) != EOF)
    {
        printf("Case %d:\n", ++count);
        memset(visit, 0, sizeof(visit));
        map[1] = 1;
        visit[1] = 1;
        dfs(1);
        printf("\n");
    }
    return 0;
}
posted @ 2012-05-03 01:29  CY_K_YC  阅读(136)  评论(0编辑  收藏  举报