这句话的意思是,如图中月份12天数23时,就是1223;当月份9天数2时,就是0902.
可以看到在上面给出的数组元素中,并没有连续挨在一起的2023数字元素——就有人可能输出答案0。
所以这里要看一下—— ——子序列的含义:
子系列的意思是,从数组中选取几个数字
也就是子系列的数据在原数组中不一定是连续存在的
例如,我选了第一行的第十个数据元素2,再选第二十五个数据元素0,再选第一行最后一个数据元素2,然后选第二行第十八个数据元素3.
那么现在我选出来的数据组成的子序列就是——2023.
这道题数组长度100较大,所以也不能用Excel或计算器啥的凑巧。
这里写一个搜索代码
dfs——if(pos)——check——vis——if(mm,dd)
#include <stdio.h>
#include <stdlib.h>
//#include<bits/stdc++.h>
//将题目的100个数据放进来
int a[100] = { 5, 6, 8, 6, 9, 1, 6, 1, 2, 4 ,9, 1, 9, 8, 2, 3, 6, 4, 7, 7, 5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9, 2,
7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3, 8, 5, 1, 6, 3, 4, 6 ,7 ,0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6, 1, 4, 0, 1,
0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3 };//记得有;每个数据元素之间要加,
//思路:求8位日期,且前4位一定是2023
int ans;//统计符合要求的日期数
bool vis[20240000];
bool check(int date)//日期是8位数,不会超出int的位数范围
{
if (vis[date])//这个日期访问过了,排除重复
return false;
vis[date] = 1;//赋值
int mm = date / 100 %100;//把天数去掉/,%提取出来最后两位数月份,因为年数是确切的2023不用看
int dd = date % 100;//提取天数
//排除月份
if (mm < 1 || 12 < mm)//pos4和pos5自由组合的,要排除00,13,19等
return false;
//选择天数
if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12)
{
if (1 <= dd && dd <= 31)
return true;
}
else if (mm == 4 || mm == 6 || mm == 9 || mm == 11)
{
if (1 <= dd && dd <= 30)
return true;
}
else if (mm == 2)
{
if (1 <= dd && dd <= 28)
return true;
}
else//不合法
{
return false;
}
}
void dfs(int x, int pos, int date)
//x是长度100数组中的遍历下标
//pos是指当前的这个长度为8的子系列,遍历到了多长的地方(0~7)
//date是形成的日期
{
//判断
if (x == 100)//数组a遍历完了
return;
if (pos == 8)
{
if (check(date))//日期合法且未重复
++ans;
return;
}
//判断选择子系列(pos4是月份的十位,可能为前导0或1)
if ((pos == 0 && a[x] == 2) ||
(pos == 1 && a[x] == 0) ||
(pos == 2 && a[x] == 2) ||
(pos == 3 && a[x] == 3) ||
(pos == 4 && 0 <= a[x] && a[x] <= 1) ||
(pos == 5 && 0 <= a[x] && a[x] <= 9) ||
(pos == 6 && 0 <= a[x] && a[x] <= 3) ||
(pos == 7 && 0 <= a[x] && a[x] <= 9))//2023前4位,有多种类似符号时,带上()更清楚
dfs(x + 1, pos + 1, date * 10 + a[x]);
//不能加{}和else
dfs(x + 1, pos, date);//pos和date不更新就是不选择这个数字进子系列
}
int main(int argc, char* argv[])
{
// 请在此输入您的代码
dfs(0, 0, 0);
printf("%d", ans);
return 0;
}