深度优先搜索c语言代码,K-进制数 (C语言代码) 仿深度优先搜索

本文介绍了一种使用深度优先搜索算法来计算特定条件下K进制数的数量的方法。通过插空的方式,确保了相邻的数字不会同时为0,并且详细解释了如何递归地解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考代码:#include

#include

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);  //尝试下一个空

}

}

解题思路:

题中N位的K进制数,除了最高位一定不为0外,剩下(N-1)位数都可能为0或非零数,而且相邻两位数不能同时为0。这道题可以看作一个插空问题,从首位开始从左到右按顺序插空,因为本题对0有不相邻限制,因此这里我们以非零数为对象插空,只要两个靠近的非零数之间的0不超过1个即可。

以4位二进制数为例:我们插入第一个非零数(首位)后,二进制数可写作1xxx(x表示还没插入的空位),考虑到两个0不能相邻,第二个非零数的位置可以在第二位或第三位,即插入第二个非零数后,该二进制数变为了11xx或者101x(没有插入默认为零),如此循环下去,最终找到所有符合条件的4位二进制数为:1111、1110、1101、1011、1010,共5个。

如此我们可以仿深度优先搜索对所有情况遍历,找到所有符合条件的插入方式。

注意事项:

1.除二进制数之外,单位非零数都不只有1个,个数为(K-1)。假设一个合适的插入方式包含了t个非零数,那么它包含的K进制数为(K-1)^t个。

2.因为我们插入的数都为非零数,所以当我们需要在个位填入0时(如111x变为1110),可以先给个位延伸一位填入非零数(11101),最后计算的时候少计算一位非零位即可。

3.算法改进:如果在搜索的时候记录从第n位开始遍历的结果个数并标记,下次搜索到该位时就可以直接套用记录的结果,这样可以减少递归次数并算出所有符合要求的1-N位K进制数个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值