求助
查看原帖
求助
526518
respect_lowsmile楼主2022/10/19 21:58

dfsdfs 零分求助,本人真的不会打 dfsdfs ,所以找题练,调了一晚上了也没调出来,递归学的也不咋样,不明白为什么程序只输出 00

#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;
}
2022/10/19 21:58
加载中...