棋盘翻转大师:力扣LCP41题"翻转黑白棋"深度解析

贾蔷
• 阅读 8

截图未命名.jpg 棋盘翻转大师:力扣LCP41题"翻转黑白棋"深度解析 递归算法 方向向量 力扣LCP41 C++ 第1张 一、问题理解 题目要求在一个黑白棋棋盘上找出一个空位('.'表示),当放置一个黑棋('X')后,能够翻转最多数量的白棋('O')。翻转规则遵循标准黑白棋规则:在一条直线上,两个黑棋之间的所有白棋都会被翻转。

二、核心算法思路 双层遍历:检查棋盘每个空位 八方向探测:每个方向模拟落子后的翻转效果 递归翻转:处理连锁翻转反应 三、完整代码解析 class Solution { public: int flipChess(vector& chessboard) { int m = chessboard.size(), n = chessboard[0].size(); int max_flips = 0; // 记录最大翻转数

    // 8个方向向量:上、下、左、右、四个对角线
    int dirs[8][2] = {{-1,-1},{-1,0},{-1,1},
                     {0,-1},        {0,1},
                     {1,-1}, {1,0}, {1,1}};

    // 遍历棋盘每个位置
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            if (chessboard[i][j] == '.') {  // 发现空位
                vector<string> temp = chessboard;  // 复制棋盘
                temp[i][j] = 'X';  // 模拟落子
                int flips = countFlips(temp, i, j);  // 计算翻转数
                max_flips = max(max_flips, flips);  // 更新最大值
            }
        }
    }
    return max_flips;
}

// 计算单次落子后的翻转数量
int countFlips(vector<string>& board, int x, int y) {
    int flips = 0;
    int dirs[8][2] = {{-1,-1},{-1,0},{-1,1},
                     {0,-1},        {0,1},
                     {1,-1}, {1,0}, {1,1}};

    // 检查8个方向
    for (auto& dir : dirs) {
        int dx = dir[0], dy = dir[1];
        int nx = x + dx, ny = y + dy;
        vector<pair<int,int>> to_flip;  // 记录待翻转位置

        // 沿当前方向搜索
        while (nx >= 0 && nx < board.size() && 
               ny >= 0 && ny < board[0].size()) {
            if (board[nx][ny] == 'O') {  // 遇到白棋
                to_flip.emplACe_back(nx, ny);
                nx += dx;
                ny += dy;
            } 
            else if (board[nx][ny] == 'X') {  // 遇到黑棋,可以翻转
                for (auto [i,j] : to_flip) {
                    board[i][j] = 'X';  // 执行翻转
                    flips++;
                }
                flips += flipChain(board, to_flip);  // 处理连锁反应
                break;
            } 
            else {  // 遇到空位,终止搜索
                break;
            }
        }
    }
    return flips;
}

// 处理连锁翻转
int flipChain(vector<string>& board, vector<pair<int,int>>& positions) {
    int additional = 0;
    for (auto [x,y] : positions) {
        additional += countFlips(board, x, y);  // 递归计算新增翻转
    }
    return additional;
}

}; 四、关键知识点 方向数组应用:使用8方向向量简化方向遍历 递归思维:通过flipChain函数处理连锁反应 棋盘复制技巧:使用temp副本避免修改原棋盘 五、实际应用 这种棋盘模拟+递归搜索的方法也适用于:

参考:编程资料

点赞
收藏
评论区
推荐文章
如何搞定力扣刷题?
好买网(www.goodmai.com)IT技术交易平台前言大家好,我是bigsai,好久不见!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强!最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都重视到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了!BA321C5AFE6864CE60465A0E7
Wesley13 Wesley13
3年前
STM32F0单片机快速入门四 翻转引脚
1\.第一个工程翻转引脚上一篇文章我们详细介绍了STM32F030从复位时取得复位向量,系统初始化,然后跳转到main()函数的过程。下面我们结合一个最简单的例子,对Cube库的使用做一个简单的介绍。我们用Keil打开下面这个工程:STM32Cube\_FW\_F0\_V1.11.0ProjectsSTM32F030
Wesley13 Wesley13
3年前
iOS 网易新闻用户头像翻转效果核心代码
1.首先要先分清实现的过程,目测应该是使用了苹果自带的UIview类方法:(void)transitionFromView:(UIView\)fromViewtoView:(UIView\)toViewduration:(NSTimeInterval)durationoptions:    (UIViewAnimatio
Wesley13 Wesley13
3年前
4412开发板
迅为4412开发板(屏幕翻转)(Android(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.eechina.com%2Fkeyword%2FAndroid)4.4设置不锁屏、去除休眠、屏幕休眠等)19.20.1屏幕翻转本节介绍如何把快速设置栏中的“屏幕锁定/自
Wesley13 Wesley13
3年前
Java位运算原理及使用讲解
前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法。举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1。可能的做法是使用三木运算符,判断原始值为1还是0,如果是1,设置为0,否则设置为0.但是使用位运算,不用判断原始值,直接改变值就可以:1^num//num为原始值当然,一条语句可能
深度学习 深度学习
2天前
力扣701题:二叉搜索树插入操作 - 递归解法详解
一、内容简介本文详细解析了力扣701题"二叉搜索树中的插入操作"的递归实现方法。通过遵循二叉搜索树的性质,展示了如何高效地在BST中插入新节点。文章包含完整注释代码、算法思路讲解和复杂度分析,帮助读者掌握BST操作的核心技巧。二、算法思路‌递归终止条件‌:
贾蔷 贾蔷
1个月前
力扣145题:二叉树的后序遍历, 解题思路与C++实现
题目介绍力扣第145题要求实现一个函数,该函数接收一个二叉树的根节点,并返回该树的后序遍历结果。后序遍历是一种遍历二叉树的算法,其顺序为:先遍历左子树,是右子树,是根节点。解题思路分析解题时,我们可以使用递归或迭代的方法。递归方法较为直观,但可能导致栈溢出
贾蔷 贾蔷
4星期前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们
贾蔷 贾蔷
4星期前
力扣501题 解题思路和步骤 C++代码实现,力扣(leetcode)
问题背景及描述力扣501题要求我们找出在一个二叉搜索树(BST)中的众数。二叉搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点,且小于其右子树中的任何节点。众数是指在BST中出现次数最多的值。解题思路分析解题的关键在于理解BST的性质以
贾蔷 贾蔷
2星期前
2013 蓝桥杯 省赛B组 翻硬币(洛谷P8597题) 从暴力BFS到贪心算法的优化之路
一、问题背景与理解洛谷P8597是一道经典的翻硬币问题,题目描述如下:给定两个由''和'o'组成的字符串s1和s2,分别表示初始状态和目标状态。每次操作可以选择任意位置开始翻转连续的k个硬币(''变'o','o'变'')。要求计算出从初始状态变为目标状态所