USACO 4.3 Street Race&The Primes(跪了)

涉及到的图的题目不会,贴个别人代码先过了,晕,这几天真是烦死了。

/*

ID: hubiao cave

PROG: prime3

LANG: C++

*/



#include <fstream>
#include <iostream>
#include <cmath>
#include <memory.h>

using namespace std;

const int MAX = 99999;

const int DIV[6] = {0,10000, 1000, 100, 10, 1};

bool primes[MAX];

int n, sum;

int prime1[10][1000][6];
int nprime1[10];

int prime3[10][1000][6];
int nprime3[10];

int prime15[10][10][100][6];
int nprime15[10][10];

int prime124[10][10][10][100][6];
int nprime124[10][10][10];

void dfs1();
void dfs2();
void dfs3();
void dfs4();
void dfs5();
void dfs6();
void dfs7();

ifstream fin("prime3.in");
ofstream fout("prime3.out");

void addPrime(int s){
    int i, k=1, tmp[6];
    int num = s;
    while(num!=0){
        tmp[k] = num/DIV[k];
        num = num%DIV[k];
        k++;
    }
    int c =0;
    for(i=1; i<=5; ++i)
        c += tmp[i];
    if(c == sum){
        primes[s]=true;
        for(i=1; i<=5; ++i){
            int t = nprime1[tmp[1]];
            prime1[tmp[1]][t][i] = tmp[i];
        }
        nprime1[tmp[1]]++;

        for(i=1; i<=5; ++i){
            int t = nprime3[tmp[3]];
            prime3[tmp[3]][t][i] = tmp[i];
        }
        nprime3[tmp[3]]++;

        bool flag=true;
        for(i=1; i<=5; ++i){
            if(tmp[i]==0){
                flag=false;
                break;
            }
            int t = nprime15[tmp[1]][tmp[5]];
            prime15[tmp[1]][tmp[5]][t][i] = tmp[i];
        }
        if(flag)
            nprime15[tmp[1]][tmp[5]]++;
        
        for(i=1; i<=5; ++i){
            int t = nprime124[tmp[1]][tmp[2]][tmp[4]];
            prime124[tmp[1]][tmp[2]][tmp[4]][t][i] = tmp[i];
        }
        nprime124[tmp[1]][tmp[2]][tmp[4]]++;

    }
}

int map[6][6];
int ans[1000][6][6];
int cnt=0;

bool inline larger_than(int a[6][6], int b[6][6]){
    for(int i=1; i<=5; ++i)
        for(int j=1; j<=5; ++j)
            if(a[i][j]>b[i][j])
                return true;
            else if(a[i][j]<b[i][j])
                return false;
            else 
                continue;
    return false;
}

void addResult(){
    int p = ++cnt;
    while(p!=0 && larger_than(ans[p-1], map)){
        memcpy(ans[p], ans[p-1], sizeof(int)*36);
        p--;
    }
    memcpy(ans[p], map, sizeof(int)*36);
}

int isPrime(int a){
    int n = static_cast<int>(sqrt(a));
    for(int i=2; i<=n; ++i)
        if(!(a%i))
            return 0;
    return 1;
}

int d=0;
void initPrime(){
    for(int i=10001; i<=99999; ++i)
        if(isPrime(i))
            addPrime(i);
}

bool check1(int r){
    int i,sum=0;
    for(i=1; i<=5; ++i)
        sum = sum*10+map[r][i];
    
    if(!primes[sum]) return false;

    return true;
}

bool check2(int c){

    int i,sum=0;
    for(i=1; i<=5; ++i)
        sum = sum*10+map[i][c];

    if(!primes[sum]) return false;
    
    return true;
}

void dfs1(){
    int t = nprime1[map[1][1]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=2; j<=5; ++j)
                map[j][j] = prime1[map[1][1]][i][j];

            dfs2();
        }
}

void dfs2(){
    int t = nprime3[map[3][3]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=1; j<=5; ++j)
                map[6-j][j] = prime3[map[3][3]][i][j];

            dfs3();
        }
}

void dfs3(){
    int t = nprime15[map[1][1]][map[1][5]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=2; j<=4; ++j)
                map[1][j] = prime15[map[1][1]][map[1][5]][i][j];

        dfs4();
        }
}

void dfs4(){
    int t = nprime124[map[1][2]][map[2][2]][map[4][2]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=3; j<=5; ++j)
                map[j][2] = prime124[map[1][2]][map[2][2]][map[4][2]][i][j];

            dfs5();
        }
}

void dfs5(){
    int t = nprime124[map[1][4]][map[2][4]][map[4][4]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=3; j<=5; ++j)
                map[j][4] = prime124[map[1][4]][map[2][4]][map[4][4]][i][j];

            for(int k=1; k<=9; k+=2){
                map[5][3]=k;

                if(check1(5))
                    dfs6();
            }
        }
}

void dfs6(){
    int t = nprime15[map[1][1]][map[5][1]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=2; j<=4; ++j)
                map[j][1] = prime15[map[1][1]][map[5][1]][i][j];

            for(int k=1; k<=9; k+=2){
                map[3][5] = k;

                if(check1(3))
                    dfs7();
            }
        }
}

void dfs7(){
    int t = nprime124[map[2][1]][map[2][2]][map[2][4]];
    if(t==0)
        return;
    else
        for(int i=0; i<t; ++i){
            for(int j=3; j<=5; ++j)
                map[2][j] = prime124[map[2][1]][map[2][2]][map[2][4]][i][j];

            for(int a=0; a<=9; ++a){
                map[4][3]=a;
                if(check2(3))
                    for(int b=1; b<=9; b+=2){
                        map[4][5] = b;

                        if(check1(4) && check2(5) )
                            addResult();
                    }
            }
        }
}


void output(){
    for(int k=0; k<cnt-1; ++k){
        for(int i=1; i<=5; ++i){
            for(int j=1; j<=5; ++j)
                fout<<ans[k][i][j];
            fout<<endl;
        }
        if(cnt==1)
            return;
        fout<<endl;
    }

    for(int i=1; i<=5; ++i){
        for(int j=1; j<=5; ++j)
            fout<<ans[cnt-1][i][j];
        fout<<endl;
    }
}

int main(){

    //input
    fin>>sum>>map[1][1];

    //init
    for(int i=1; i<=5; ++i)
        for(int j=1; j<=5; ++j)
            ans[0][i][j] = 9;
    initPrime();

    //solve
    dfs1();

    //output
    output();

    return 0;
}

 

#include <iostream>
#include <fstream>
#define MAX 101
using namespace std;
ifstream fi("race3.in");
ofstream fo("race3.out");
 
int adjl[MAX][MAX];
int ans[MAX][2];
bool used[MAX],tused[MAX];
int N,start,end;
 
void init()
{
    int a=0,i=0;
    while (a!=-1)
    {
        fi >> a;
        while (a>=0)
        {
            adjl[i][ ++adjl[i][0] ]=a;
            used[a]=true;
            fi >> a;
        }
        i++;
    }
    N=i-2;
    for (i=0;i<=N;i++)
    {
        if (adjl[i][0]==0)
            end=i;
        if (!used[i])
            start=i;
    }
}
 
void dfs3(int i)
{
    int k,j;
    for (k=1;k<=adjl[i][0];k++)
    {
        j=adjl[i][k];
        if (!tused[j])
        {
            tused[j]=true;
            dfs3(j);
        }
    }
}
 
void dfs2(int i)
{
    int k,j;
    for (k=1;k<=adjl[i][0];k++)
    {
        j=adjl[i][k];
        if (!used[j])
        {
            used[j]=true;
            dfs2(j);
        }
    }
}
 
void question2()
{
    int i,j,k;
    for (i=1;i<=N-1;i++)
    {
        memset(used,0,sizeof(used));
        memset(tused,0,sizeof(tused));
        dfs2(i);
        tused[i]=true;
        tused[0]=true;
        dfs3(0);
        k=1;
        for (j=0;j<=N;j++)
            if (j!=i && used[j] && tused[j])
            {
                k=0;
                break;
            }
        if (k)
            ans[ ++ans[0][1] ][1]=i;
    }
}
 
void dfs1(int i)
{
    int k,j;
    for (k=1;k<=adjl[i][0];k++)
    {
        j=adjl[i][k];
        if (!used[j])
        {
            used[j]=true;
            dfs1(j);
        }
    }
}
 
void question1()
{
    int i;
    for (i=1;i<=N-1;i++)
    {
        memset(used,0,sizeof(used));
        used[i]=true;
        dfs1(0);
        if (!used[N])
            ans[ ++ans[0][0] ][0]=i;
    }
}
 
void print()
{
    int i;
    fo << ans[0][0];
    for (i=1;i<=ans[0][0];i++)
        fo <<' ' << ans[i][0];
    fo << endl;
    fo << ans[0][1];
    for (i=1;i<=ans[0][1];i++)
        fo <<' ' << ans[i][1];
    fo << endl;
    fi.close();
    fo.close();
}
 
int main()
{
    init();
    question1();
    question2();
    print();
    return 0;
}

 

 

posted @ 2014-01-10 15:34  cavehubiao  阅读(192)  评论(0编辑  收藏  举报