【未完待续】Java蓝桥杯--算法训练(1)典型问题的递归框架

预备练习(一)

字母的全排列问题:

 1 package package1;
 2
 3 //对字母进行全排列
 4 import java.util.*;
 5
 6 public class A1 {
 7
 8     static List f(String s) {
 9         List lst = new Vector();
10
11         // 出口
12         if (s.length() == 1) {
13             lst.add(s);
14             return lst;
15         }
16
17         // 下面是递归的相似性
18         /* Vector非常类似ArrayList,但是Vector是同步的。 */
19         for (int i = 0; i < s.length(); i++) {
20             char x = s.charAt(i);
21             /* charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。 */
22             // 开始递归(从去掉的i位置元素递归)
23             List t = f(s.substring(0, i) + s.substring(i + 1));
24
25             /*
26              * str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;
27              *
28              * str=str.substring(int beginIndex,int
29              * endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str;
30              */
31             for (int k = 0; k < t.size(); k++) {
32                 lst.add("" + x + t.get(k));
33             }
34         }
35         return lst;
36
37     }
38
39     public static void main(String[] args) {
40         List lst = f("ABC");// 传入一个串,将元素全部放在列表中
41         for (int i = 0; i < lst.size(); i++) {
42             System.out.println(lst.get(i));
43         }
44     }
45 }

方法二:(数组)

 1 package package1;
 2
 3 //对字母进行全排列
 4 //方法二:数组
 5 import java.util.*;
 6
 7 public class A1 {
 8     //aa:待排数据
 9     //k:考虑当前位置(数组下标)
10     static void f(char[] aa ,int k) {
11
12         //出口
13         if(k==aa.length-1) {
14             System.out.println(String.valueOf(aa));
15             //把数组类型的aa强制转换成字符串类型,并输出
16             return ;//K达到上线,不能继续递归,程序返回
17         }
18
19
20         //递归相似性
21         //从第k个数开始,到数组中的最后一个数为止,依次进行交换(k从第一个数开始)
22         for(int i=k;i<aa.length;i++) {//i=k,即不能漏掉不交换的情况
23             {char t=aa[k];aa[k]=aa[i];aa[i]=t;}//试探
24             f(aa,k+1);//调用K+1;让后面的元素
25             {char t=aa[k];aa[k]=aa[i];aa[i]=t;}//回溯,再交换回来
26             //做试探,递归之后立即回溯
27         }
28     }
29
30
31
32
33     public static void main(String[] args) {
34         f("ABC".toCharArray(),0);//k从第0个开始
35         /*toCharArray():将字符串转换成字符数组,便于对每一个字符进行单独操作*/
36         }
37
38 }

题目一:

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

【数据格式】
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

要求输出1个整数,表示最后感冒蚂蚁的数目。

例如,输入:
3
5 -2 8
程序应输出:
1

再例如,输入:
5
-10 8 -20 12 25
程序应输出:
3

题目(二)

小明最近喜欢搭数字积木。一共有10块积木,每个积木上有一个数字,0~9。

搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

0
1 2
3 4 5
6 7 8 9

0
3 1
7 5 2
9 8 6 4

请你计算这样的搭法一共有多少种?

题目(三)

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
D国最多可以派出1人。
E国最多可以派出1人。
F国最多可以派出3人。
那么最终派往W星的观察团会有多少种国别的不同组合呢?

题目(四)

已知不同字母构成的串,求它的全排列

题目(五)

有重复的字母中求取出m个所有组合

例如: "AAABBCCCCCCDD" 中取3个字母的所有组合

题目(六)

A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

请填写出所有符合要求的排列中,字典序最小的那个。
例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。

原文地址:https://www.cnblogs.com/Catherinezhilin/p/8541977.html

时间: 2024-11-08 20:59:03

【未完待续】Java蓝桥杯--算法训练(1)典型问题的递归框架的相关文章

Java蓝桥杯--算法训练(2)最大最小公倍数

题目: 解决方法: package com.algorithm.java.blueBirdge; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class leastCommonMultiple { public static void main(String[] args){ Scanner read =n

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

蓝桥杯 算法训练 ALGO-152 8-2求完数

算法训练 8-2求完数 时间限制:50.0s   内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例输出 与上面的样例输入对应的输出.例: 数据规模和约定 1-9999 题目解析: 在求一个自然数的因子时,只需要循环的用该自然数与小于它的一半加一取余即可,这样可以将循环次数缩短 1 / 2 ,提高运行速度. 示例代码: 1 public class Main { 2 public static void

蓝桥杯 算法训练 ALGO-121 猴子分苹果

算法训练 猴子分苹果 时间限制:1.0s   内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果.第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起.这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果.第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个.问,原来这些猴子至少采了多少个苹果. 输入格式 两个整数

蓝桥杯 算法训练 ALGO-156 表达式计算

算法训练 表达式计算 时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. 题目解析: 运算优先级: 括号 → 乘除 → 加减 例如 1-2+3*(4-5) (1)计算(4-5),表达式变为  1-2+3*-1 (2

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3

蓝桥杯 算法训练 ALGO-125 王、后传说

算法训练 王.后传说 时间限制:1.0s   内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办法. 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个).当然,皇后也不会攻击国王.

蓝桥杯 算法训练 ALGO-139 s01串

算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述  s01串初始为"0"  按以下方式变换  0变1,1变01 输入格式  1个整数(0~19) 输出格式  n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定  0~19 示例代码: 1 import java.util.Scanner; 2 3 public class Main { 4 static StringBuffer sb = new StringBuffer(); 5 public

蓝桥杯 算法训练 ALGO-117 友好数

算法训练 友好数 时间限制:1.0s   内存限制:256.0MB 问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的. 220的约数和有:1 2 4 5 10 11 20 22 44 55 110=284 284的约数和有:1 2 4 71 142=220 所以220和284是友好的. 编写程序,判断两个数是否是友好数. 输入格式 一行,两个整数,由空格分隔 输出格式 如