当前位置: 代码迷 >> 综合 >> 蓝桥杯B组C语言-猜数字
  详细解决方案

蓝桥杯B组C语言-猜数字

热度:85   发布时间:2024-01-19 12:28:46.0
题目:今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,
两个7之间有7个其它数字。如下就是一个符合要求的排列:
17126425374635
当然,如果把它倒过来,也是符合要求的。
请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

首先理解题意,7对数字,14个数,每个数字只可能出现2次,并且其中间的数字个数等于该数字。现在要求你找出以74开头的14位整数。分析:根据题意,这14位数只可能是如下这样:

74_ _ _ _4_7_ _ _ _ _

很容易想到用数组来装这14个数,由于数组下标从0开始,所以,为了便于计算,我们定义一个装15个元素的数组。然后根据要求,(联想到8皇后问题)可以使用回溯法,一个一个试探。

#include<stdio.h>
int a[15]={0};
int  dfs(int n)
{   int i;
    if(n==4) n++;      /*每个数字只可能出现2次,4已经出现过来,所以试探到4的时候直接跳过,从5开始;*/
    if(n>6) return 1;    /*7已经出现过来,当>6的时候,表明本轮试探结束*/
    for(i=3; i<=14; i++)    /*i从3开始,是因为下标为1,2的地方数字已固定*/
    {
        if(i==7 || i==9) continue;    /*下标为7和9的数字已固定*/
        if(i+n+1<=14 && a[i]==0 && a[i+n+1]==0)    /*a[i]=0,a[i+n+1]=0表明该位置的值没有确定下来*/
        {
            a[i]=a[i+n+1]=n;    /*设置值为n,因为n代表某对数字之间的数字个数,也就是该数字*/
            if(dfs(n+1))      /*继续试探下一个数*/
            {
                return 1;    /*当n值就是满足条件的值时,返回1;*/
            }
            a[i]=a[i+n+1]=0;//dfs(n+1)已经将a[i]和a[i+n+1]改变   /*n不满足条件,则将原来试探的值重新修改为0*/
        }
    }
    return 0;
}
int main()
{   int i;
    a[1]=7;     /*初始化,因为这些位置的数字已经固定了*/
    a[2]=4;
    a[9]=7;
    a[7]=4;
    dfs(1);    /*从1开始试探*/
    for(i=1; i<=14; i++)
    {
        printf("%d",a[i]);
    }       /*输出14位数*/
    printf("\n");
    return 0;
}

DFS为深度优先遍历,这种遍历方法在图的深度优先遍历中讲过。可以回过头再去看下。

  相关解决方案