21.12.8抛硬币问题

其实,小明有一个小秘密,那就是暗恋计算机系的一个女生很久了。但是又不知道那个女生是怎么想的。3.7女生节就要到了,小明一直在纠结要不要跟那个女生表白。思来想去没有结果。于是乎他觉得采用最原始的办法——抛硬币来决定。正面表白,反面继续沉默观望。不过就像《爱情公寓3》结尾曾小贤说的那样“当面对两个选择时,抛硬币总能奏效,并不是因为它总能给出对的答案,而是在你把它抛在空中的那一秒里,你突然知道你希望它是什么!”呃呃呃,扯远了,其实当硬币还停留在空中的时候,小明想知道的却是:如果我连续抛N次,那么不连续出现正面的可能情况有多少种(即任何相邻两次都不全是正面)?哎,也许这就是作为工科生的思维吧!

请你帮小明写一个程序,输出所有的可能情况(用0表示反面,1表示正面)。

提示:任何一个合法序列的特征是不存在2个1相邻,例如N=4,可行的有0000,0001,0010,0100,0101,1000,1001,1010,共8种。

输入只有一行一个整数N,表示抛N次硬币。(1 \le N \le 141≤N≤14)

输出有M+1行。

前M行输出每一种可能情况,不同情况按照字典序从小到大排列。

最后一行输出一个数字M,表示不连续出现正面的可能情况的总数。

这是一个多循环的递归问题。

1、只要设置的递归计次器cou没达到抛硬币总数总数n,就做一次抛硬币,进入下一层;

2、如果前一次是1的时候直接令本次结果是0并进入下一层。

希望可以找到改进的点

#include <stdio.h>
#include <stdlib.h>
int count=0;
void scl(int *a,int cou,int n,int start)
{
    if(cou==n)
    {
        for(int i=0;i<n;i++)
        {
            printf("%d",a[i]);
        }
        printf("\n");
        count++;
    }
    else
    {
        if(a[start-1]==1&&start!=0)
        {
            a[start]=0;
            scl(a,cou+1,n,cou+1);
        }
        else
        for(int i=0;i<=1;i++)
        {
                a[start]=i;
                scl(a,cou+1,n,cou+1);
        }
    }
}
int main()
{
    int a[100]={0},n;
    scanf("%d",&n);
    scl(a,0,n,0);
    printf("%d",count);
    return 0;
}

上一篇:Dynamic Rankings(动态主席树 : 整体二分)


下一篇:数据库——SQL语法练习