题目A:日期统计
思路分析:
本题的题目比较繁琐,我们采用暴力加DFS剪枝的方式去做,我们在DFS中按照8位日期的每一个位的要求进行初步剪枝找出所有的八位子串,但是还是会存在19月的情况,为此还需要在CHECK函数中进一步剪枝,使得月份天数都符合条件
作者题解:
#include<iostream>
using namespace std;
int a[105], ans;
bool vis[20240000];
bool check(int date)//进一步剪枝,判断日期是否合法
{
if (vis[date])return false;
vis[date] = 1;//标记是否访问过
int mm = date / 100 % 100;//取出月份判断是否合法
int dd = date % 100;//取出天数判断是否合法
if (mm < 1 || mm > 12)return false;//月份小于1大于12都不合法
if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12)
{
if (1 <= dd && dd <= 31)return true;//大月如果是31天表示合法
}
else if (mm == 2)
{
if (1 <= dd && dd <= 28)return true;//如果是2月不超过28天表示合法
}
else if (1 <= dd && dd <= 30)return true;//不是2月也不是大月不超过30天表示合法
else return false;
}
void dfs(int x, int pos, int date)
{
if (x == 100)return;
if (pos == 8)
{
if (check(date))++ans;
return;
}
if (pos == 0 &a