二、编程题(ACM模式)5-6题
5 (2022小红书)一个序列的生成方式如下:序列生成需要一个基础序列A,这个序列由n个不大于100的数字组成,同时给定镜像复制次数m。然后对于A进行m次镜像复制,例如序列A={1,2,3},则一次镜像复制后得到的序列是{1,2,3,3,2,1},两次镜像复制得到的序列是B={1,2,3,3,2,1,1,2,3,3,2,1}。现在给出你生成一个序列所需要的参数,请你计算该序列的第k位是多少。
输入描述
3 2 9
1 2 3
输入第一行包含三个整数n,m,k,含义如题所示
输入第二行包含n个正整数,每个正整数都不大于100,表示基础序列A,数字间由空格隔开
输出描述
3
输出仅包含一个正整数,即序列第k位的数字
![](https://img-blog.csdnimg.cn/img_convert/1dbee0062a2de93357b4bb86d5a17edc.png)
package 分治回溯算法;
import java.util.ArrayList;
import java.util.Scanner;
public class Exercise05 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("输入第一行,包含三个整数:n(数字个数),m(镜像复制次数),k(该序列的第k位):");
int n = input.nextInt();
int m = input.nextInt();
int k = input.nextInt();
System.out.println("输入第二行,包含n个正整数,每个正整数都不大于100,表示基础序列A,数字间由空格隔开:");
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(input.nextInt());
}
list = newList(list, m);
System.out.println("该序列的第k位是:" + list.get(k));
}
private static ArrayList<Integer> newList(ArrayList<Integer> list, int m) {
if (m == 0) {//不用进行复制了,返回即可
return list;
}
for (int i = list.size() - 1; i >= 0; i--) {
list.add(list.get(i));//将列表的数字 倒着依次输入到 列表的后面
}
return newList(list, m- 1 );
}
}
6 (2022华为)士兵在迷宫中执行任务,迷宫中危机重重,他需要在最短的时间内到达指定的位置。你可以告诉士兵他最少需要多长时间吗?输入一个n*m的迷宫中,迷宫中0为路,1为墙,2为起点,3为终点,4为陷阱,6为炸弹。士兵只能向上下左右四个方向移动,如果路径上为墙,不能移动。已知每走一步需要花费1个单位的时间,走到陷阱上需要花费3个单位的时间,走到炸弹上将会激活炸弹将炸弹上下左右的墙炸为路。
注意点:
(1)炸弹只能炸聚地,不会炸掉陷阱
(2)炸弹、陷阱只能发挥一次作用
(3)迷宫为最大为25*25
(4)用例保证士兵一定有方法能到达终点
输入描述
4 4
1 1 1 1
1 6 2 1
1 1 0 1
1 3 1 1
第一行输入n和m
第二行输入n*m的矩阵
输出描述
3
最少需要的单位时间
解释:士兵在位置2,向左移动到炸弹上,会将炸弹周围的墙炸掉,向下走两步 即可到达终点