zoukankan      html  css  js  c++  java
  • C语言网 蓝桥杯 1117K-进制数

    这是一道较难的题目,我刚开始用排列组合的方式来做,并没有做出来,故运用了的深搜算法。

    深搜算法的概念:

    选其中一条路,遍历完成后,逐步返回直至全部遍历,最后返回起点。

    解题思路 :

    题目中对零的个数没有要求,只是说不能有两个零相邻,所以可以用深搜找出这个数不同位置上有零

    数的种类,最后在进行阶乘运算算出一共有多少数字。

    代码如下:

    #include<stdio.h>
    #include<math.h>
    int N,K,sum;
    void dfs(int x,int step);//步数代表数字中不为零的位数。
    int main()
    {
        scanf("%d%d",&N,&K);
        dfs(1,1);  //从第一位开始插空 首位数字必不可能为零。
        printf("%d ",sum);
        return 0;
    }
    void dfs(int x,int step)
    {
        int next[2]={1,2};//向右移动一位或两位 一位代表下一位不是零,两位代表下一位是零
        int tx,i;
        if(x==N)  //个位不为0时
        {
            sum+=pow(K-1,step);    //step等于非零数的个数,(K-1)^step即为K进制数个数
            return;
        }
        if(x==N+1)  //个位为0时
        {
            sum+=pow(K-1,step-1);  //此时已经越界,应将步数减去一进行计算。因为步数代表数字中不为零的位数。
            return;
        }
        for(i=0;i<=1;i++)
        {
            tx=x+next[i];
            dfs(tx,step+1);  //尝试下一个空
        }
     return;
    }

  • 相关阅读:
    C#后台正则表达式
    Layer 弹出层抖动问题
    JS中子页面父页面方法 变量相互调用
    layer最大话.最小化.还原回调方法
    trove远程连接mongodb
    tar.gz tar.bz2的解压命令
    IO测试工具之fio详解
    HTTP请求方法
    jmeter --使用put方法上传文件
    DHCP的原理和实现过程
  • 原文地址:https://www.cnblogs.com/cong12586/p/10544186.html
Copyright © 2011-2022 走看看