深信服3-10 笔试第四题 (DFS+回溯)

感谢@offer来啊12138 指正

题目详细:求小王拾取的最大金币数量

地图中1为金币 -1为不可逾越的墙壁 0为空地 小王可以用一次技能消除一个墙壁

思路:

当有两个房间,一个房间的金币比另外一个房间的金币多时 需要回溯金币少的房间 例如图二

public class test {
    static int count = 0;

    static int max = 0;

    static int k = 1;

    //图一
//    static int[][] map = {{0,-1,-1,-1,0}
//                        ,{0,-1,1,-1,0}
//                        ,{0,-1,1,-1,0}
//                        ,{-1,-1,1,1,-1}
//                        ,{-1,-1,1,1,-1}
//                        ,{-1,-1,1,1,-1}
//                        ,{-1,-1,-1,-1,-1}
//            //目标 8
//    };
  //图二
//      static int[][] map = {{0,-1,-1,-1,0}
//                        ,{0,-1,1,-1,0}
//                        ,{0,-1,-1,-1,0}
//                        ,{0,-1,1,1,-1}
//                        ,{0,-1,1,1,-1}
//                        ,{0,-1,1,1,-1}
//                        ,{0,-1,-1,-1,-1}
//            //目标 6
//    };

//    //图三
//static int[][] map2 = {{0,-1,-1,-1,0}
//        ,{0,-1,-1,-1,0}
//        ,{0,-1,-1,-1,0}
//        ,{-1,-1,1,1,-1}
//        ,{-1,-1,1,1,-1}
//        ,{-1,-1,1,1,-1}
//        ,{-1,-1,-1,-1,-1}
//        //目标 0
//};
    static int[][] map = {{0,-1,-1}
                            ,{-1,-1,1}};// 0

    //剪枝图
    static boolean[][] vis;

//    static int[][] map = {{1,-1},{-1,1}};
    public static void main(String[] args) {

        vis = new boolean[map.length][map[0].length];
        for(int i = 0;i<map.length;i++){
            Arrays.fill(vis[i],false);
        }

        dfs(0,0);
        System.out.println(max);
    }

    //k为技能次数
    public static void dfs(int x,int y) {

        if(x >= map.length || y >= map[0].length || x < 0 || y < 0 || vis[x][y]){
            return;
        }

        boolean UseK = false;
        if(k == 1 && map[x][y] == -1){
            //尝试消除墙壁
            k--;
            map[x][y] = 0;
            UseK = true;
        }else if(k == 0 && map[x][y] == -1){
            //无法消除
            return;
        }


        boolean isAdd = false;
        if(map[x][y] == 1){
            count++;
            map[x][y] = 0;
            vis[x][y] = true;
            isAdd = true;
        }else if(map[x][y] == 0){
            vis[x][y] = true;
        }

        dfs(x+1,y);
        dfs(x,y+1);
        dfs(x-1,y);
        dfs(x,y-1);

        //回溯
        if(UseK){
            k = 1;
            map[x][y] = -1;
        }

        if(isAdd) {
            map[x][y] = 1;
            vis[x][y] = false;
            max = Math.max(count,max);
            count--;
        }


    }


}
全部评论

相关推荐

Redis的主要特点:高性能,持久化,原子操作,高可用性。Redis基本数据类型:字符串(String):缓存,计数器,这里面可以存字符串,整数,浮点数,哈希(Hash):存储对象,HSET存,HGET获取列表(List):消息队列,栈,队列:LPUSH,RPUSH,栈:LPOP,RPOP集合(Set):标签,好友关系,无序,有序集合(Sorted&nbsp;Set):排行榜,优先级队列,有序,集合都是每个元素关联一个数。Bitmaps:可用与位操作,适合存布尔值,HyperLogLog:可用于估算适合统计唯一值Redis的线程问题:他是单线程的,为了避免上下文切换和锁竞争。持久化问题,还有具体好处:RDB:快照,恢复速度快,可能丢失最后一次的数据,RDB触发条件:手写SAVE,BGSAVE,或者自动触发。AOF:写时复制,数据安全性高,文件体积大,恢复太慢。AOF重写机制:AOF通过创建一个AOF文件且包含当前数据集的最小操作集。Redis事务如何实现,支持回滚吗?Redis用MULTI,EXEC,DISCARD和WATCH命令支持事务且按顺序执行,不能回滚。发布/订阅模式:常用命令:SUBSCRIBE,PUBLISH,UNSUBSCRIBE,就是订阅,发布,un订阅,(取关,怎么好记怎么来)Redis的高可用和分布式问题:Redis&nbsp;Sentinel&nbsp;是什么?哨兵模式,监控健康状态,自动转移故障同时更新主节点,主从复制需要replicaof命令。Redis&nbsp;Cluster&nbsp;是什么?这个节点通信机制了解吗?这是集群模式,分布式解决方案,支持数据分片和自动故障转移同时选举出新的主节点。而且使用Gossip协议进行节点通信。Redis的性能问题:缓存穿透:这里放布隆过滤器。缓存雪崩:设置永远不过期,重启时候或者访问量少的时候备份,缓存击穿:这里放互斥锁,和永不过期。过期策略:定时删除,惰性删除,用EXPIRE命令设置过期时间。怎么用Redis实现分布式锁:一般使用SETNX命令实现分布式锁。Redis如何实现会话存储:一般使用字符串和哈希结构存。常用的命令:SET,GET,HSET,HGET,LPUSH,RPUSH,LPOP,RPOP,ZADD,SADD内存碎片:就是你内存分配和释放过程产生的碎片,可以用MEMORY&nbsp;PURGE清理。Redis数据倾斜:就是你数据不均匀,可以用CLUSTER&nbsp;REBALACE平衡数据。差不多,后面找到新的会重新加进去,看这篇就对了,小手点点赞,你也开心我也开心,很多时候可能说期望与现实落差很大,你可能从一个说了出来没人听过的小县城出来,一腔热血不远千里出门到省城去读书,家里人很高兴,因为你是小镇上唯二考上大学的人,但是当你见过社会的真实之后也许你会感叹,池塘的骄傲无非不过是海洋的边角料所以你得过且过,有那么一天突然想起来,哦,如果说我去做了会怎么样,有些东西还是去试一下的,就算周围人不理解你,就算他们被传统思维所囚禁,就算你觉得很难和他们沟通,这些也不重要,你这般年轻,为何不去做?加油啊,陌生人,但行好事,莫去焦虑了。#牛客AI配图神器#
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务