蓝桥杯【省赛】【C组】——卡片(深度搜索)

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 11 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?

题目分析

这个题目是典型的深搜问题,假如什么时候把卡片用完最后一个数就是那一个,假如不够它也拼不出那个数;

解题思路

这个题目思路有很多种,据我知道的就有两种:

思路1:可以直接用0到9的一维数组每个元素都有2021个,然后用死循环拆分每一个数字,用一个就减一个,用完就循环结束

思路2:直接计算1用完的结束位置,因为每个卡片的个数都是一样的,所以结束的应当也是1用完的时候,遍历从1开始循环,把每个数字拆开判断是否有1,有多少就卡片减多少个,拆完之后结果数加一,直到1的卡片2021个全部用完就可以输出结果的前面那一个数

#include 
int N=2021;
void dfs(int temp)
{
    if(N<=0)                    //假如卡片用完了则输出那个数减一 
    {
        printf("%d",temp-1);    
        return;
    }
    int t=temp;
    while(t)                  //因为是从1开始的,所以最先用完,只需判断它的卡片什么时候用完 
    {
        if(t%10==1)                
        {
            N--;    
        }t/=10;
    }temp++;                    //因为最后这里不符合条件也加了一次,所以结果要减一 
    dfs(temp);
}
int main()
{
    int i,j;
    dfs(1);
    return 0;
}

【答案】:3181

你可能感兴趣的:(C语言,深搜,蓝桥杯,算法)