HDU 1016 Prime Ring Problem(DFS)

来源:互联网 发布:foxmail mac邮件位置 编辑:程序博客网 时间:2024/05/20 18:16

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

#include<stdio.h>#include<string.h>int a[25];//a[i]来表示第i个位置放数字a[i]int vis[25];//vis[i]记录数字i是否被放置好int n;bool is_prime(int k,int l)//判断质数{    int s=k+l;    for(int i=2; i*i<=s; i++)    {        if(s%i==0)            return 0;    }    return 1;}void dfs(int n,int num){    if((num==n)&&is_prime(a[n-1],a[0]))//表示已经搜索到n-1的下一个位置(注意是从位置0开始的),即n个数都放置好了,且最后一个数与第一个数相加也是质数    {        for(int i=0; i<n-1; i++)            printf("%d ",a[i]);        printf("%d\n",a[n-1]);    }    else    {        for(int i=2; i<=n; i++)        {            if((vis[i]==0)&&is_prime(i,a[num-1]))//如果符合条件            {                vis[i]=1;//数字i放进去,做标记                a[num]=i;//位置num放数字i                dfs(n,num+1);//继续搜索下一个位置                vis[i]=0;//清空标记            }        }    }}int main(){    int cas=1;    while(~scanf("%d",&n))    {        printf("Case %d:\n",cas++);        memset(vis,0,sizeof(vis));        a[0]=1;//题目规定,位置0一定要是1        vis[1]=1;//数字1已被放置好        dfs(n,1);        printf("\n");    }    return 0;}


1 0
原创粉丝点击