dfs 零分求助,本人真的不会打 dfs ,所以找题练,调了一晚上了也没调出来,递归学的也不咋样,不明白为什么程序只输出 0 。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e4+5;
int T;
char ch[10];
int prime[N],vis[N],sw[N],tong[N];
int cnt,ans;
int rn(int year)//判断闰年
{
if(year%3200==0) return 0;
if(year%400==0) return 1;
if(year%100==0) return 0;
if(year%4==0) return 1;
return 0;
}
int isprime(int x)//判断质数
{
if(x<2) return 0;
for(int i=1;i<=cnt;++i)
if(x%prime[i]==0) return x==prime[i];
return 1;
}
void dfs(int now)//now表示现在搜到第几位
{
if(now==0)//全部搜完
{
int year=sw[1]*1000+sw[2]*100+sw[3]*10+sw[4];//年份
if(sw[1]==0&&sw[2]==0&&sw[3]==0&&sw[4]==0) return;//年份全是0就返沪
if(sw[5]==0&&sw[6]==2)//二月份
{
if(sw[7]==2)
{
if(rn(year)) if(sw[7]>2) return ;
else if(sw[7]>2 || (sw[7]==2&&sw[8]==9) ) return ;
}
}
int tmp=sw[1]*10000000+sw[2]*1000000+sw[3]*100000+sw[4]*10000+sw[5]*1000+sw[6]*100+sw[7]*10+sw[8];//计算组成的8位数
if(!isprime(tmp)) return ;
ans++;
return ;
}
if(now==6)//算完了日
{
if(sw[7]>3) return ;
if(sw[7]==0&&sw[8]==0) return ;
int tmp=sw[7]*10+sw[8];
if(!isprime(tmp)) return ;
}
if(now==4)//算完了月和日
{
if(sw[6]==1 || sw[6]==3 || sw[6]==5 || sw[6]==7 || sw[6]==8 || sw[6]==10 || (sw[5]==1 && sw[6]==2)) if(sw[7]==3&&sw[8]>1) return ;
if(sw[6]==4 || sw[6]==6 || sw[6]==9 || (sw[5]==1&&sw[6]==1) ) if(sw[7]==3&&sw[8]>0) return ;
if(sw[6]>2) return ;
if(sw[5]>1) return ;
if(sw[5]==0&&sw[6]==0&&sw[7]==0&&sw[8]==0) return ;
int tmp=sw[5]*1000+sw[6]*100+sw[7]*10+sw[8];
if(!isprime(tmp)) return ;
}
if(ch[now]=='-')//选择
{
for(int i=0;i<=9;++i)
{
sw[now]=i;
dfs(now-1);
sw[now]=0;
}
}
else sw[now]=ch[now]-'0',dfs(now-1);//无法选择
}
int main()
{
vis[1]=1;
for(int i=2;i<=N;++i)//线性筛素数
{
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=N;++j)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
scanf("%d",&T);
while(T--)
{
//memset(sw,0,sizeof(sw));
for(int i=1;i<=8;++i)
cin>>ch[i];
dfs(8);
cout<<ans<<'\n';
ans=0;
}
return 0;
}