这句话的意思是,如图中月份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]);//不能加{}和elsedfs(x + 1, pos, date);//pos和date不更新就是不选择这个数字进子系列
}int main(int argc, char* argv[])
{// 请在此输入您的代码dfs(0, 0, 0);printf("%d", ans);return 0;
}