蓝桥杯——递归

一、数字三角形

(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;

(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;

 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7         static int[][] a;
 8         static int n;
 9     public static void main(String[] args) {
10         Scanner input = new Scanner(System.in);
11         n = input.nextInt();
12         a = new int[n][n];
13         for(int i=0;i<n;i++){
14             for(int j=0;j<=i;j++){
15                 a[i][j] = input.nextInt();
16             }
17         }
18         System.out.println(f(0,0));
19         
20 
21     }
22     //某数的当前最大和等于当前数加上下一行与之相邻的两数的当前最大和。
23     public static int f(int i,int j){
24         if(i==n-2) return a[i][j]+Math.max(a[i+1][j], a[i+1][j+1]);
25         return a[i][j]+Math.max(f(i+1,j), f(i+1,j+1));
26     }
27 }

二、未名湖边的烦恼

每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

输入格式
  两个整数,表示m和n
输出格式
  一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7         static int n;
 8         static int m;
 9         static int sum;
10     public static void main(String[] args) {
11         Scanner input = new Scanner(System.in);
12         m = input.nextInt();
13         n = input.nextInt();
14         if(m>=n) f(m-1,n,1);
15         System.out.println(sum);
16     }
17     public static void f(int m,int n,int k){
18         if(k<0)    return;
19         if(m==0||n==0) sum++;
20         else{
21             f(m-1,n,k+1);
22             f(m,n-1,k-1);
23         }
24         
25     }
26 }

三、s01串

  s01串初始为"0"
  按以下方式变换
  0变1,1变01

输入格式
  1个整数(0~19)
输出格式
  n次变换后s01串
样例输入
3
样例输出
101
 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         Scanner input = new Scanner(System.in);
 9         int n = input.nextInt();
10         StringBuffer a = new StringBuffer("0");
11         f(n,a);
12     }
13     public static void f(int n,StringBuffer a){
14         if(n==0){
15             System.out.println(a.toString());
16             return;
17         }
18         StringBuffer temp = new StringBuffer();
19         for(int i=0;i<a.length();i++){
20             if(a.charAt(i)=='0'){
21                 temp.append("1");
22             }else{
23                 temp.append("01");
24             }
25         }
26         f(n-1,temp);
27     }
28 }

 四、递归求二进制表示位数  

问题描述
  给定一个十进制整数,返回其对应的二进制数的位数。例如,输入十进制数9,其对应的二进制数是1001,因此位数是4。
 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         Scanner input = new Scanner(System.in);
 9         int a = input.nextInt();
10         System.out.println(f(a));
11     }
12     public static int f(int a){
13         if(a==0) return 0;
14         return 1+f(a/2);
15     }
16 }

五、猴子分苹果

问题描述
  秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分。这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果。第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起。这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果。第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个。问,原来这些猴子至少采了多少个苹果。
样例输入
5 1
样例输出
15621
 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7     static int n;
 8     static int m;
 9     public static void main(String[] args) {
10         Scanner input = new Scanner(System.in);
11         n = input.nextInt();
12         m = input.nextInt();
13         int i=1;
14         while(true){
15             i++;
16             if(f(i,0)==1){
17                 System.out.println(i);
18                 break;
19             }
20             
21         }
22                 
23     }
24     public static int f(int sum,int i){
25         if(sum%n!=m) return 0;
26         if(i==n&&sum%n==m){
27             return 1;
28         }    
29         return f(sum-(sum-m)/n-m,i+1);
30     }
31 }

 六、瓷砖铺放  

有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法?
  例如,长度为4的地面一共有如下5种铺法:
  4=1+1+1+1
  4=2+1+1
  4=1+2+1
  4=1+1+2
  4=2+2
  编程用递归的方法求解上述问题

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;


public class Main {
    static int n;
    static int m;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        f(n);
        System.out.println(m);
                
    }
    public static void f(int n){
        if(n>=2){
            f(n-1);
            f(n-2);
        }else if(n==1){
            f(n-1);
        }else{
            m++;
        }

    }
}

 七、求先序排列  

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。

 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7     static String a;
 8     static String b;
 9     public static void main(String[] args) {
10         Scanner input = new Scanner(System.in);
11         a = input.next();
12         b = input.next();
13         f(0,a.length()-1,b.length()-1);
14                 
15     }
16     public static void f(int a1,int b1,int b2){
17         if(a1>b1)    return;
18         System.out.print(b.charAt(b2));
19         f(a1,a.indexOf(b.charAt(b2))-1,b2-(b1-a.indexOf(b.charAt(b2)))-1);
20         f(a.indexOf(b.charAt(b2))+1,b1,b2-1);
21         
22         
23 
24     }
25 }

 八、种树

A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门 得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤 肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。
  最终市政府给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。

输入格式
  输入的第一行包含两个正整数n、m。
  第二行n个整数Ai。
输出格式
  输出一个整数,表示最佳植树方案可以得到的美观度。如果无解输出“Error!”,不包含引号。
样例输入
7 3
1 2 3 4 5 6 7
样例输出
15
样例输入
7 4
1 2 3 4 5 6 7
样例输出
Error!
 1 import java.math.BigInteger;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7     static int n;
 8     static int[] a;
 9     static boolean[] b;
10     static int max;
11     static boolean flag;
12     public static void main(String[] args) {
13         Scanner input = new Scanner(System.in);
14         n = input.nextInt();
15         int m = input.nextInt();
16         a = new int[n];
17         for(int i=0;i<n;i++){
18             a[i] = input.nextInt();
19         }
20         b = new boolean[n];    
21         f(m,0,0);
22         if(flag) System.out.println(max);
23         else System.out.println("Error!");
24     }
25     public static void f(int i,int j,int sum){
26         if(i==0&&j<=n){
27             if(max<sum) max = sum;
28             flag  = true;
29             return;
30         }
31         for(int h=j;h<n;h++){
32             if(b[h]==false){
33                 if(h<n-1) b[h+1] = true;
34                 if(h==0){b[n-1] = true;b[h] = true;} 
35                 f(i-1,h+1,sum+a[h]);
36                 if(h<n-1) b[h+1] = false;
37                 if(b[0]==true)    b[n-1] = true;
38                 if(h==0){b[n-1] = false;b[h] = false;} 
39             }
40         }
41         
42 
43     }
44 }

 

 

posted @ 2017-03-24 14:32  来一点音乐  阅读(393)  评论(0编辑  收藏  举报