月份打表,数字笔画打表,使用月份的二维数组判断日期的合法性,
使用数字的一维数组直接计算日期的笔画数,计算年差值,用各自的
总和相减即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;
int num[10]={6,2,5,5,4,5,6,3,7,6};
int yue[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};
int a,b,c;
int is_run(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
return 1;
return 0;
}
int is(int t1,int t2,int t3)
{
if(t3>yue[is_run(t1)][t2])
return 0;
if(t1<a||(t1==a&&t2<b)||(t1==a&&t2==b&&t3<c))
{
// cout<<"hehe"<<endl;
return 0;
}
return 1;
}
int cyear(int t1,int t2,int t3)
{
int sum=0;
for(int i=1;i<t1;i++)
{
if(is_run(i))
sum+=366;
else
sum+=365;
}
for(int i=1;i<t2;i++)
sum+=yue[is_run(t1)][i];
sum+=t3;
return sum;
}
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
int m;
cin>>m;
a=(s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+s[3]-'0';
b=(s[4]-'0')*10+s[5]-'0';
c=(s[6]-'0')*10+s[7]-'0';
// cout<<is(2015,7,18)<<endl;
// cout<<a<<' '<<b<<' '<<c<<endl;
int flag=0;
for(int i=a;i<3000;i++)
{
for(int j=1;j<13;j++)
{
for(int k=1;k<32;k++)
{
int total=0;
if(!is(i,j,k))
continue;
total=num[i/1000]+num[i/100%10]+num[i/10%10]+num[i%10]+num[j/10]+num[j%10]+num[k/10]+num[k%10];
if(total==m)
{
// cout<<total<<endl;
// cout<<i<<' '<<j<<' '<<k<<endl;
cout<<cyear(i,j,k)-cyear(a,b,c)<<endl;
flag=1;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
if(!flag)
cout<<-1<<endl;
}
return 0;
}