您的位置:首页 > 其它

USACO 4.3 Street Race&The Primes(跪了)

2014-01-10 15:34 429 查看
涉及到的图的题目不会,贴个别人代码先过了,晕,这几天真是烦死了。

/*

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
)
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: