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\n",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;
}

posted @ 2019-03-16 20:27  月为暮  阅读(249)  评论(0编辑  收藏  举报