HDU 1016(Prime Ring Problem)

/*DFS
Date: 2012/10/11
题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1016
思路:从1开始找,在从与1之和为质数的val开始,再从与val为质数的开始,当找到最后一个点时判断一下
它和1是否为质数,若是则输出
*/

#include<iostream>
#include<cmath>
using namespace std;
#define maxn 21
bool visited[maxn];
int arr[maxn];
int n,count = 1;
bool isPrime(int x)
{
    for(int i = 2; i*i <= x; i++)
        if(x % i == 0)
            return false;
    return true;    
}
void dfs(int val,int num)  //val为当前找的值,num为已找到的数的个数
{
    int i;
    visited[val] = true;
    arr[num] = val;
    if(num == n)
    {
        if(isPrime(val+1))
        {
            printf("%d",arr[1]);
            for(i = 2; i <= n; i++)
                printf(" %d",arr[i]);
            printf("\n");
        }
    }
    else
    {
        for(i = 2; i <= n; i++)
            if(!visited[i] && isPrime(i+val))
                dfs(i,num+1);
    }
    visited[val] = false;
}
int main()
{
    //freopen("1006.txt","r",stdin);
    while(scanf("%d",&n) != EOF)
    {
        memset(visited,false,sizeof(visited));
        printf("Case %d:\n",count++);
        dfs(1,1);
        printf("\n");
    }
    return 0;
}

 

posted @ 2012-10-11 23:48  sorryhao  阅读(145)  评论(1)    收藏  举报