14——1

这句话的意思是,如图中月份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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值