要求,两个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为深度优先遍历,这种遍历方法在图的深度优先遍历中讲过。可以回过头再去看下。