为了账号安全,请及时绑定邮箱和手机立即绑定

用C解决蜂窝问题,一点没有思路,有会的大佬可以帮忙看下嘛

/ 猿问

用C解决蜂窝问题,一点没有思路,有会的大佬可以帮忙看下嘛

C
a12svs 2020-03-14 18:01:54

http://img4.sycdn.imooc.com/5e6cab3a0001052216000490.jpg

查看完整描述

2 回答

?
Warm_Sweet

这其实是一个斐波那契数列。

如下代码只是我个人的想法,可能跟你想要的不太一样,但是没办法,因为我也是小白,只能想到这么个不是办法的法子。

#include <stdio.h>

int way(int a, int b)

{

     int d, way, way0, x, i;

     d = b - a;

     if (d >= 0 && d <= 8)

     {

         for (way = 1, way0 = 0, i = 0; i < d; i++)

             {

                    x = way;

                    way += way0;

                    way0 = x;

              }

         return way;

     }

     return 0;

}

int main()

{

     int a, b;

     a = 7;

     b = 3;

     int number = way(a, b);

     if (number == 0)

            printf("%s\n", "请检查蜂巢代号及爬行方向");

     else

            printf("从%d处爬到%d处共有%d种路线\n", a, b, number);

     return 0;

}

对于这个问题,我也很有兴趣。如果你有什么想法的话,我会很乐意你分享给我的哦。

查看完整回答
2 反对 2020-03-17
  • a12svs
    a12svs
    好的,我想问下为什么这个问题是斐波那契数列呢
  • Warm_Sweet
    Warm_Sweet
    斐波那契数列有这样的特征:自第三项起,每一项都等于前两项的和。 那么我们来看这个问题:蜜蜂只能向右走,而右边的数一定比自己大。我们从1号开始: 蜜蜂要移动到2号蜂巢,而与2号相邻的,且在2号左边的只有1号,所以只有一条路。 现在蜜蜂要爬到3号的位置,与3号相邻且在其左边的有1号和2号,那么1→3一共有1 + 1 = 2条路(认为1→1有一条路)。 现在是4号位置:与4号相邻且在其左边的是2号和3号,所以一共有1→2一种+1→3两种,三条路。 相应地,1→5则是1→3的两种+1→4的三种,一共五种方法。 …… 上面是解释蜂巢问题与斐波那契数列的对应关系,下面解释原因: 以【1→5】为例:5号左边分别是3号和4号,【3→5有】两条路:35;345;而【4→5】只有一条路:45; 【1→3】有两条路:13;123;【1→4】有三条路:124;134;1234; 用我们高中数学学过的排列组合法,就是【1→3】的方法数*【3→5】的方法数+【1→4】的方法数*【4→5】的方法数= 7。 但是【1→4】包含了所有1号先到号再到4号的所有方法,因此上面我们多算了345这种情况,去掉这个重复的部分,等同于【3→5】也只有一种方法,所以结果是【1→3】*1+【1→4】*1 = 5 解释得有点复杂,甚至有点啰嗦,但是很容易看懂。
  • a12svs
    a12svs
    好的我懂啦谢谢
?
戈德夫

蜂窝问题蜜蜂只能向右走,所以只能走数字比本身大1和大2的蜂巢,所以可以建立二叉树,最后求叶子节点个数

//img4.sycdn.imooc.com/5e70680000014cf211360561.jpg

#include<stdio.h>

#include <string.h>

#include <stdlib.h>

typedef struct Node
{
	int value;
	
	Node *left;
	
	Node *right;
	
}*tNode;

void CreateBiTree(tNode *T,int i,int n)
{
	int q=i;
	
	if(q>n) 
	{
		*T=NULL;
		
		return;
	}
	else 
	{
		*T=(tNode)malloc(sizeof(Node));
		
		(*T)->value=q;
		
		CreateBiTree(&(*T)->left,q+1,n);
		
		CreateBiTree(&(*T)->right,q+2,n);
	}
}

int CountLeaf(tNode *bt,int count)
{
    if((*bt)!=NULL)
    {
        if((*bt)->left==NULL&&(*bt)->right==NULL) count++;
        
        count=CountLeaf(&(*bt)->left,count);
        
        count=CountLeaf(&(*bt)->right,count);
    }
    return count;
}

int main(){

	tNode root;
	
	int n,m,k=0;
	
	scanf("%d%d",&n,&m);
	
	CreateBiTree(&root,n,m);
	
	k=CountLeaf(&root,k);
	
	printf("%d",k);
	
	return 0; 
}


查看完整回答
2 反对 2020-03-17
  • a12svs
    a12svs
    谢谢,但是我看不太懂,递归的有点蒙555

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信