【每日一题Day244】LCP 41. 黑白翻转棋 bfs dfs

这篇具有很好参考价值的文章主要介绍了【每日一题Day244】LCP 41. 黑白翻转棋 bfs dfs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LCP 41. 黑白翻转棋

n*m 大小的棋盘中,有黑白两种棋子,黑棋记作字母 "X", 白棋记作字母 "O",空余位置记作 "."。当落下的棋子与其他相同颜色的棋子在行、列或对角线完全包围(中间不存在空白位置)另一种颜色的棋子,则可以翻转这些棋子的颜色。

  • 思路

    枚举棋盘中每一个未下棋的位置,求出在该位置下黑子时,能够反转的白子数目,取最大值返回即可。对于每一个位置需要求出八个方向末尾是黑子的连续白子数目,并且如果将一个白子反转为黑子后,还需要搜索该位置延伸出去能够翻转的白子数目,故而可以使用bfs或者dfs实现

bfs
  • 实现

    将每个方向的可以反转的白子加入队列中

    class Solution {
        String[] chessboard;
        int[][] dirs = {{0, 1},{0, -1}, {1, 0}, {-1, 0}, {1, -1}, {1, 1},{-1, 1}, {-1, -1}};
        int m, n;
        public int flipChess(String[] chessboard) {
            m = chessboard.length;
            n = chessboard[0].length();
            this.chessboard = chessboard;
            int res = 0;
            for (int i = 0; i < m; i++){
                for (int j = 0; j < n; j++){
                    if (chessboard[i].charAt(j) == '.'){
                        res = Math.max(res, bfs(i, j));
                    }
                }
            }
            return res;
        }
        // 使用bsf搜索在位置(x,y)下黑子时,能够反转的白子数目
        // 将白子放入队列中,搜索八个方向末尾是黑子的连续白子数目
        // 如果下一个位置是白子,那么继续放入队列
        // 如果下一个位置是黑子,那么记录连续白子数目
        // 如果下一个位置没有子,那么忽略不计
        public int bfs(int x, int y){
            char[][] chess = new char[m][n];       
            for (int i = 0; i < m; i++){
                chess[i] = chessboard[i].toCharArray();
            }
            int res = 0;
            Deque<int[]> queue = new LinkedList<>();
            queue.addLast(new int[]{x, y});
            chess[x][y] ='X';
            while (!queue.isEmpty()){
                int[] loc = queue.pollFirst();
                x = loc[0];
                y = loc[1];
                for (int k = 0; k < 8; k++){
                    int i = x + dirs[k][0] , j = y + dirs[k][1];
    
                    while (i >= 0 && i < m && j >= 0 && j < n && chess[i][j] == 'O'){
                     
                        i += dirs[k][0];
                        j += dirs[k][1];
                        
                    }
                    if (i >= 0 && i < m && j >= 0 && j < n && chess[i][j] == 'X'){
                    
                        i -= dirs[k][0];
                        j -= dirs[k][1];
                        res += Math.max(Math.abs(x - i), Math.abs(y - j));
                        while (x != i || y != j){
                            chess[i][j] = 'X';
                            queue.addLast(new int[]{i, j});
                            i -= dirs[k][0];
                            j -= dirs[k][1];
                        }
                        
                    }
                    
                }
            }
            
            return res;
        }
    }
    
dfs
  • 实现

    使用额外数组记录每个方向可以反转的白子位置,再进行dfs文章来源地址https://www.toymoban.com/news/detail-494190.html

    class Solution {
            char[][] cb;
            int m,n;
            int ans = 0;
            int[] directions = new int[]{-1,-1,0,1,1,-1,1,0,-1};
            public int flipChess(String[] chessboard) {
                m = chessboard.length;
                n = chessboard[0].length();
    
                this.cb = new char[m][n];
                for(int i = 0; i < m; i++){
                    for(int j = 0; j < n; j++){
                        if(chessboard[i].charAt(j)=='.'){
                            for(int t = 0; t < m; t++){
                                cb[t] = chessboard[t].toCharArray();
                            }
                            ans = Math.max(ans,dfs(i,j));
                        }
                    }
                }
                return ans;
            }
    
            private int dfs(int i, int j){
                List<int[]> nexts = new ArrayList<>();
                for(int index = 0; index < 8; index++){
                    int x = i+directions[index];
                    int y = j+directions[index+1];
                    List<int[]> tmp = new ArrayList<>();
                    while(x>=0&&x<m&&y>=0&&y<n&&cb[x][y]=='O'){
                        tmp.add(new int[]{x,y});
                        x+=directions[index];
                        y+=directions[index+1];
                    }
    
                    if(x>=0&&x<m&&y>=0&&y<n&&cb[x][y]=='X'){
                        nexts.addAll(tmp);
                    }
                }
    
                for(int[] next:nexts){
                    cb[next[0]][next[1]] = 'X';
                }
    
                int ans = nexts.size();
                for(int[] next:nexts){
                    ans += dfs(next[0],next[1]);
                }
    
                return ans;
            }
        }
    
    作者:钰娘娘丿--乀
    链接:https://leetcode.cn/problems/fHi6rV/solutions/2315793/yu-niang-niang-lcp-41-hei-bai-fan-zhuan-yv1s6/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

到了这里,关于【每日一题Day244】LCP 41. 黑白翻转棋 bfs dfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS

    序列化和反序列化二叉搜索树【LC449】 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。 设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列

    2024年02月10日
    浏览(30)
  • 每日一题 230二叉搜索树中第K小的元素(中序遍历)

    给定一个二叉搜索树的根节点  root  ,和一个整数  k  ,请你设计一个算法查找其中第  k   个最小元素(从 1 开始计数)。 示例 1: 示例 2:

    2024年02月10日
    浏览(33)
  • ( 数组和矩阵) 378. 有序矩阵中第 K 小的元素 ——【Leetcode每日一题】

    难度:中等 给你一个 n x n n x n n x n 矩阵 m a t r i x matrix ma t r i x ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O ( n 2 ) O(n^2) O ( n 2 ) 的解决方案。 示例 1:

    2024年02月14日
    浏览(42)
  • LeetCode·每日一题·822. 翻转卡片游戏·哈希

    作者:小迅 链接:https://leetcode.cn/problems/card-flipping-game/solutions/2368969/ha-xi-zhu-shi-chao-ji-xiang-xi-by-xun-ge-7ivj/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 根据题意,只要有数字满足 fronts[i]=backs[i],那么 fronts[i] 绝对不可能是

    2024年02月14日
    浏览(27)
  • 每日一题(822. 翻转卡片游戏)-集合set

    822. 翻转卡片游戏 简述为:找到桌面卡片中 不重复的最小值,卡片可以来回反转 如果 卡片前面后面的数字相同 则抛弃不用 在剩下的卡片中 找到最小值(前后可以反转 == 卡片不分前后)

    2024年02月14日
    浏览(31)
  • 2023-07-26力扣每日一题-区间翻转线段树

    链接: 2569. 更新数组后处理求和查询 题意: 给两个等长数组nums1和nums2,三个操作: 操作1:将nums1的 [l,r] 翻转(0变1,1变0) 操作2:将 nums2[any] 变成 nums2[any]+nums1[any]*p ,p由操作给出,any表示数组里的每一位 操作3:查询nums2的和 解: 由于每次更新nums2的时候,不需要考虑

    2024年02月15日
    浏览(31)
  • 2023-05-15LeetCode每日一题(按列翻转得到最大值等行数)

    点击跳转到题目位置 给定 m x n 矩阵 matrix 。 你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。) 返回 经过一些翻转后,行与行之间所有值都相等的最大行数 (1) 首先思考一个问题,如果光给 一行元素 的话,那

    2024年02月05日
    浏览(31)
  • 罗勇军 →《算法竞赛·快冲300题》每日一题:“游泳” ← DFS+剪枝

    【题目来源】 http://oj.ecustacm.cn/problem.php?id=1753 http://oj.ecustacm.cn/viewnews.php?id=1023 【题目描述】 游泳池可以等分为n行n列的小区域,每个区域的温度不同。 小明现在在要从游泳池的左上角(1, 1)游到右下角(n, n),小明只能向上下左右四个方向游,不能游出泳池。 而小明对温度十分

    2024年02月10日
    浏览(28)
  • 每日一练 | 网络工程师软考真题Day41

    1、包过滤防火墙对通过防火墙的数据包进行检查,只有满足条件的数据包才能通过,对数据包的检查内容一般不包括   。 A.源地址 B.目的地址 C.协议 D.有效载荷 2、下面关于ARP木马的描述中,错误的选项是   。 A.ARP木马利用ARP协议漏洞实施破坏 B.ARP木马发作时可导

    2024年02月07日
    浏览(30)
  • 【Py/Java/C++三种语言详解】LeetCode每日一题240216【二叉树BFS】LeetCode103、二叉树的层序遍历II

    有LeetCode交流群/华为OD考试扣扣交流群可加: 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336 了解算法冲刺训练 LeetCode103、二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进

    2024年02月20日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包