小M的光明之魂速通挑战 | 豆包MarsCode AI刷题

115 阅读4分钟

今天给大家带来的一道题是:小M的光明之魂速通挑战

听起来很有趣,是一个游戏吗?

对,今天就是来玩游戏打怪~

什么游戏?我玩游戏贼6,快点我赶紧来下载一起玩!

别急,玩之前先看游戏游戏规则:

{AD483568-B7ED-4FE6-8E8F-B8987D857CC3}.png

啥?你说的游戏就是这一个???就不该信你的话,再见!

别,你不是说你玩游戏贼6吗,这个游戏给你玩,看看你怎么玩~,给你几个样例让你练练手:

{453D1D88-1052-437C-AE46-0E768641DADE}.png

我相信你玩游戏贼六,应该不到1s就想出来了吧~,要不先看看笔者愚蠢的写法?

。。。

首先我们先看一下题目要我们干什么:

  1. 我有N把武器;
  2. 面前M只BOSS;
  3. 每个BOSS有唯一编号;
  4. 只能按照题目给的BOSS顺序逐个击破;
  5. 每把武器只能用一次;
  6. 且每把武器只能击败特定编号的其中一只BOSS;
  7. 问我能击败多少只!

额。。。刚看这道题我想着能不能贪心贪一贪,发现好像不太行,就想到题目要按顺序击败BOSS,而且还要找到能够击败这个BOSS的,不然我们就只能卡在这个BOSS上面了,无法前进。。。但是只要有这把武器就是最佳的吗?

答案肯定不是的,假设我现在在编号为3的BOSS前面,我手中的武器有[3,6],[5,6],[3,4],那我现在是拿哪一把武器呢?[3,6] or [3,4].答案肯定是[3,6]. 为什么就不用说了吧!

考虑的这种有能够击败同一个编号的BOSS的武器,我们要选最优的,是不是感觉很困难~但是这道题,我们可以用一个深度优先搜索来解决,因为我们不管最优的是哪一个,我们就自己搜索全部情况!即暴搜!因为我们肯定可以从所有情况选出最优的!

好的,这道题就是一个简单的深度优先搜索问题:

  1. 我这里先定义几个全局变量,以便写dfs
  2. nn表示有多少把武器;
  3. mm表示有多少只BOSS;
  4. b数组为BOSS;
  5. a数组为武器;
  6. 然后直接dfs;
  7. 我们要按顺序击败BOSS,然后记录最终卡到哪了,所以定义为dfs(int dep)
  8. 首先考虑什么时候停止:1、打到底了,BOSS全没了,即:if(dep==mm) return;2、没有武器打BOSS了(这个情况在后面for不满足条件就不管就可以)
  9. 再来写for循环
  10. 首先肯定是判断在这一层我们能不能继续往下走,即:if((a[i][0]==b[dep]||a[i][1]==b[dep])&&!vis[i])
  11. 这里的vis数组表示第i把武器是否被用过;
  12. 可以的话我们就标记这一把武器:vis[i]=true;
  13. 然后更新一下答案ans=Math.max(dep+1,ans);
  14. 再进一步搜索下一只boss: dfs(dep+1);
  15. 搜索完回来我们需要解除这一把武器的标记vis[i]=false;
  16. 因为等运行完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);
    }
}