今天给大家带来的一道题是:小M的光明之魂速通挑战
听起来很有趣,是一个游戏吗?
对,今天就是来玩游戏打怪~
什么游戏?我玩游戏贼6,快点我赶紧来下载一起玩!
别急,玩之前先看游戏游戏规则:
啥?你说的游戏就是这一个???就不该信你的话,再见!
别,你不是说你玩游戏贼6吗,这个游戏给你玩,看看你怎么玩~,给你几个样例让你练练手:
我相信你玩游戏贼六,应该不到1s就想出来了吧~,要不先看看笔者愚蠢的写法?
。。。
首先我们先看一下题目要我们干什么:
- 我有N把武器;
- 面前M只BOSS;
- 每个BOSS有唯一编号;
- 只能按照题目给的BOSS顺序逐个击破;
- 每把武器只能用一次;
- 且每把武器只能击败特定编号的其中一只BOSS;
- 问我能击败多少只!
额。。。刚看这道题我想着能不能贪心贪一贪,发现好像不太行,就想到题目要按顺序击败BOSS,而且还要找到能够击败这个BOSS的,不然我们就只能卡在这个BOSS上面了,无法前进。。。但是只要有这把武器就是最佳的吗?
答案肯定不是的,假设我现在在编号为3的BOSS前面,我手中的武器有[3,6],[5,6],[3,4],那我现在是拿哪一把武器呢?[3,6] or [3,4].答案肯定是[3,6]. 为什么就不用说了吧!
考虑的这种有能够击败同一个编号的BOSS的武器,我们要选最优的,是不是感觉很困难~但是这道题,我们可以用一个深度优先搜索来解决,因为我们不管最优的是哪一个,我们就自己搜索全部情况!即暴搜!因为我们肯定可以从所有情况选出最优的!
好的,这道题就是一个简单的深度优先搜索问题:
- 我这里先定义几个全局变量,以便写dfs;
- nn表示有多少把武器;
- mm表示有多少只BOSS;
- b数组为BOSS;
- a数组为武器;
- 然后直接dfs;
- 我们要按顺序击败BOSS,然后记录最终卡到哪了,所以定义为
dfs(int dep) - 首先考虑什么时候停止:1、打到底了,BOSS全没了,即:
if(dep==mm) return;2、没有武器打BOSS了(这个情况在后面for不满足条件就不管就可以) - 再来写for循环:
- 首先肯定是判断在这一层我们能不能继续往下走,即:
if((a[i][0]==b[dep]||a[i][1]==b[dep])&&!vis[i]) - 这里的vis数组表示第i把武器是否被用过;
- 可以的话我们就标记这一把武器:
vis[i]=true; - 然后更新一下答案:
ans=Math.max(dep+1,ans); - 再进一步搜索下一只boss:
dfs(dep+1); - 等搜索完回来我们需要解除这一把武器的标记:
vis[i]=false; - 因为等运行完
dfs(dep+1);这一行代码的时候就说明在第dep层使用第i把武器的情况搜索完了,要恢复到之前的状态,在dep层再换一把武器进行标记后搜索(一把武器只能用一次)
最后等它搜索完就出现答案咯~,这道题就直接暴搜完成~拿下:上代码!
public class Main {
private static int[] b;
private static int[][] a;
private static int nn;
private static int mm;
private static boolean[] vis=new boolean[100];
private static int ans;
public static int solution(int n, int m, int[] boss, int[][] array) {
// Edit your code here
ans=0;
nn=n;
mm=m;
b=boss;
a=array;
dfs(0);
System.out.println(ans);
return ans;
}
public static void dfs(int dep ){
if(dep==mm) return;
for(int i=0;i<nn;++i){
if((a[i][0]==b[dep]||a[i][1]==b[dep])&&!vis[i]){
vis[i]=true;
ans=Math.max(dep+1,ans);
dfs(dep+1);
vis[i]=false;
}
}
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(solution(3, 5, new int[]{1, 2, 3, 4, 5}, new int[][]{{1, 2}, {3, 2}, {4, 5}}) == 2);
System.out.println(solution(3, 5, new int[]{4, 3, 2, 1, 5}, new int[][]{{1, 2}, {3, 2}, {4, 5}}) == 2);
}
}