hdu 1016 Prime Ring Problem

//非递归:
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;

#define N 22

int a[N],x[N],second,tag;

const bool isprime[41]= {0,
                         0,1,1,0,1,0,1,0,0,0,
                         1,0,1,0,0,0,1,0,1,0,
                         0,0,1,0,0,0,0,0,1,0,
                         1,0,0,0,0,0,1,0,0,0
                        };
bool isvalid(int k,int n)
{
    int i;
    for(i=0; i<k; i++)
        if(x[i]==x[k])
            return false;
    for(i=0; k>0 && i<k; i++)
        if(isprime[a[x[i]]+a[x[i+1]]]==false)
            return false;
    if(k==n-1 && isprime[a[0]+a[x[k]]]==false)
        return false;
    return true;
}
void print(int n)
{
    second=a[x[n]];
    tag=1;
    int i;
    printf("%d",a[x[0]]);
    for(i=1; i<=n; i++)
        printf(" %d",a[x[i]]);
    printf("\n");
}
void solve(int n)
{
    x[0]=0;
    int k=1,count=0;
    x[k]=-1;
    while(k>=1)
    {
        x[k]++;
        while(x[k]<=n-1 && !isvalid(k,n))
            x[k]++;
        if(x[k]>n-1)
            k--;
        else if(k==n-1)
        {
            print(k);
        }
        else x[++k]=-1;
    }
}

int main()
{
    int n,i,lim,t=1;
    while(scanf("%d",&n)!=EOF)
    {
        if(n&1)
        {
            printf("Case %d:\n\n",t++);
            continue;
        }
        for(i=0; i<n; i++)
            a[i]=i+1;
        printf("Case %d:\n",t++);
        tag=0;
        solve(n);
        printf("\n");
    }
    return 0;
}

 

//********************************************************

 

//递归:
#include <stdio.h>
#include <string.h>

#define N 22

bool used[N],isprime[38] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1};

int lim,ans[N]= {1};

void dfs(int cur)
{
    if(cur==lim && isprime[ ans[0]+ans[cur-1] ])
    {
        printf("1");
        for(int i=1; i<lim; i++)
            printf(" %d",ans[i]);
        printf("\n");
    }
    else
        for(int i=2; i<=lim; i++)
        {
            ans[cur]=i;
            if(!used[i] && isprime[ i+ans[cur-1] ])
            {
                used[i]=true;
                dfs(cur+1);
                used[i]=false;
            }
        }
}

int main()
{
    int cas=1;
    while(scanf("%d",&lim)!=EOF)
    {
        memset(used,false,sizeof(used));
        printf("Case %d:\n",cas++);
        dfs(1);
        printf("\n");
    }
}

 

 

posted @ 2010-08-18 13:32  菜到不得鸟  阅读(236)  评论(0)    收藏  举报