算法系列之递归函数(七位数字)

七对数字

今有两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

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

说明:这道题是2015年的蓝桥杯题目,很巧妙的一道题。

思路:

有很多小伙伴第一想到的是声明一个二维数组,以键值对的方式存放1-7这14个数字,

其实小编觉得这种方法并没有错,只是相对来说比较麻烦而已,

只要把1-7这7个数字放在一个一维数组里面就可以了,设置的时候,

只需要把这个位置和这个位置后面i个数的位置也设置为这个数就可以了,

这样就一次性用掉了两个同样的数组,当然本题的核心还是递归算法的巧妙运用,

下面的代码小编注释写的相对来说比较明确,

希望小伙伴们能够看懂,如果看不懂,评论区等着大家哦~

源代码:

package 第六届蓝桥杯;

public class 数字7对 {
//判断1~7这个数组是否被访问了。
public static boolean vis[]=new boolean[8];
//用于存放14个数的数组
public static int ten[]=new int[14];
public static void main(String[] args) {
f(0);
}
public static void f(int b){
/*for(int i=0;i<14;i++){
int j=1;
ten[i]=j;
ten[j+2]=j;
} */
if(b==14){ //达到14位数字进行
for(int i=0;i<14;i++){
System.out.print(ten[i]);
}
System.out.println("");
return;
}
//判断ten[b]这个位置是否等于0,不等于的话,说明已经赋值了,跳到下一个
if(ten[b]!=0){
f(b+1);
return;//进行回溯
}
else{
//如果等于0,说明还没有赋值,从1~7的数字中进行选值进行赋值
for(int i=1;i<=7;i++){
//还要考虑到1~7选的值是否被调用了并且i+b+1的位置应该为0
//注意:没有考虑到b+i+1应该小于14
if(vis[i]==false&&b+i+1<14&&ten[i+b+1]==0){
ten[b]=i;
ten[b+i+1]=i;
vis[i]=true;
f(b+1);
//对数据进行还原,使得更好且正确的递归
ten[b]=0;
ten[b+i+1]=0;
vis[i]=false;
}
}
//如果循环完也没找到,就进行回溯
return;
}
}
}

猜你喜欢

转载自blog.csdn.net/qq_38691107/article/details/86063354