​LeetCode解法汇总LCP 41. 黑白翻转棋

news2024/5/18 18:39:16

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

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

「力扣挑战赛」黑白翻转棋项目中,将提供给选手一个未形成可翻转棋子的棋盘残局,其状态记作 chessboard。若下一步可放置一枚黑棋,请问选手最多能翻转多少枚白棋。

注意:

  • 若翻转白棋成黑棋后,棋盘上仍存在可以翻转的白棋,将可以 继续 翻转白棋
  • 输入数据保证初始棋盘状态无可以翻转的棋子且存在空余位置

示例 1:

输入:chessboard = ["....X.","....X.","XOOO..","......","......"]

输出:3

解释: 可以选择下在 [2,4] 处,能够翻转白方三枚棋子。

示例 2:

输入:chessboard = [".X.",".O.","XO."]

输出:2

解释: 可以选择下在 [2,2] 处,能够翻转白方两枚棋子。

示例 3:

输入:chessboard = [".......",".......",".......","X......",".O.....","..O....","....OOX"]

输出:4

解释: 可以选择下在 [6,3] 处,能够翻转白方四枚棋子。

提示:

  • 1 <= chessboard.length, chessboard[i].length <= 8
  • chessboard[i] 仅包含 "."、"O" 和 "X"

解题思路:

/**
 * LCP 41. 黑白翻转棋
 * 解题思路:
 * 有可能没有太好的思路,这题的限制是8*8的棋盘,所以可以使用穷举的策略。
 * 每个位置,都计算出放入黑子之后的所有影响到的白棋。
 * 首先把chessboard转换为二位int类型的数组board,每个位置上,0代表是空的,1代表放的是白棋,2代表放的是黑棋。
 * 所以searchDirection方法中,输入值为x,y坐标,以及二维数组board。
 * 然后使用广度优先搜索,构建一个队列,队列中的初始值就是x,y,因为后面遍历中的过程中可能会添加新的。
 * 然后分别向8个方向生成新的位置newX,newY,然后查看是否满足,如果满足,则一条路径上所有的点都加入到队列中。
 * 然后继续下一轮的循环,知道队列为空。
 *
 */

 

代码:

#include <iostream>
#include <map>
#include <list>
#include <vector>
#include <set>
#include <algorithm>
#include <queue>
#include <utility>
#include <cstring>

using namespace std;

/**
 * LCP 41. 黑白翻转棋
 * 解题思路:
 * 有可能没有太好的思路,这题的限制是8*8的棋盘,所以可以使用穷举的策略。
 *
 */
class Solution_LCP41
{
public:
    static constexpr int directions[8][2] = {{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
    const int CHESS_NULL = 0;  // 没有放置
    const int CHESS_WHITE = 1; // 白棋
    const int CHESS_BLACK = 2; // 黑棋

    int searchDirection(vector<vector<int>> board, int x, int y)
    {
        queue<pair<int, int>> qu;
        int sum = 0;
        qu.emplace(make_pair(x, y));
        while (!qu.empty())
        {
            auto [nx, ny] = qu.front();
            qu.pop();
            for (int i = 0; i < 8; i++)
            {
                int newX = nx;
                int newY = ny;
                vector<pair<int, int>> record;
                bool flag = true;
                int step = 0;
                while (true)
                {
                    newY = newY + directions[i][1];
                    newX = newX + directions[i][0];
                    if (newX < 0 || newY < 0 || newX >= board[0].size() || newY >= board.size())
                    {
                        flag = false;
                        break;
                    }
                    if (board[newY][newX] == CHESS_NULL)
                    {
                        flag = false;
                        break;
                    }
                    else if (board[newY][newX] == CHESS_BLACK)
                    {
                        break;
                    }
                    record.push_back(make_pair(newX, newY));
                    step++;
                }
                if (flag)
                {
                    for (int j = 0; j < record.size(); j++)
                    {
                        board[record[j].second][record[j].first] = CHESS_BLACK;
                        qu.emplace(record[j].first, record[j].second);
                    }
                    sum += step;
                }
            }
        }
        return sum;
    }

    int flipChess(vector<string> &chessboard)
    {
        vector<vector<int>> board;
        for (const string &str : chessboard)
        {
            vector<int> line;
            for (char c : str)
            {
                if (c == 'X')
                {

                    line.push_back(2);
                }
                else if (c == 'O')
                {

                    line.push_back(1);
                }
                else
                {
                    line.push_back(0);
                }
            }
            board.push_back(line);
        }
        int max = 0;
        for (int i = 0; i < board.size(); i++)
        {
            for (int j = 0; j < board[0].size(); j++)
            {
                if (board[i][j] != 0)
                {
                    continue;
                }
                if (i == 6 && j == 3)
                {
                    std::cout << "1:" << std::endl;
                }
                int step = searchDirection(board, j, i);
                max = max > step ? max : step;
            }
        }
        return max;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想去除List重复元素?我有两种方法搞定,赶紧拿去用

关注“Java架构栈”微信公众号&#xff0c;回复暗号【Java面试题】即可获取大厂面试题 问题背景 最近就有很多小伙伴在后台私信波哥&#xff0c;问波哥这样一个问题&#xff1a;“波哥&#xff0c;我最近正在找工作&#xff0c;被面试官问到List该怎么去重&#xff1f;我感觉自…

命令执行测试-业务安全测试实操(12)

命令执行测试 测试原理和方法 在应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的承数。如PHP中的svstem、exec、shell exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。测试中如果没有对参数(如…

Lowe‘s EDI 项目数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

Flutter如何使用mvi? bloc结合自定义http库的实现

文章目录 前言一、先看看如何使用bloc吧1. 定义页面需要的数据2. 定义通用加载状态3. 定义事件4. 定义bloc5. 定义UI6. 使用 二、lib_http1. request定义2. response定义3. 适配器接口4. 构建adapter需要的数据5. 网络异常统一封装6. 核心请求类7. 提供网络访问配置8. dio适配器…

编译原理笔记13:自上而下语法分析(3)构造预测分析表、LL(1) 文法

目录 构造预测分析表不懂也能用的构造步骤FIRST、FOLLOW 和分析表的原理&#xff1f; LL(1) 文法 构造预测分析表 预测分析表的作用&#xff0c;是为推导的进行指明方向——我们用当前下推栈栈顶和读写头所指向的符号的组合&#xff08;即当前的状态&#xff09;&#xff0c;去…

网络安全学习指南:新手入门建议

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言网络安全基础知识学…

IPv6:连接未来的新一代互联网协议

由于互联网发展迅猛&#xff0c;IPv4地址数量已经接近枯竭。IPv6应运而生&#xff0c;成为下一代互联网协议。IPv6较IPv4来说&#xff0c;地址容量上升了数倍&#xff0c;并有更好的安全性和效率。 IPv6&#xff08;Internet Protocol version 6&#xff09;是指新一代互联网协…

【Java】如何优雅的关闭线程池

文章目录 背景一、线程中断 interrupt二、线程池的关闭 shutdown 方法2.1、第一步&#xff1a;advanceRunState(SHUTDOWN) 把线程池置为 SHUTDOWN2.2、第二步&#xff1a;interruptIdleWorkers() 把空闲的工作线程置为中断2.3、 第三步&#xff1a;onShutdown() 一个空实现&…

PG系列2:Linux下yum安装PG 15

文章目录 一. 下载PG二. 开始安装2.1 安装数据库2.2 初始化数据库2.3 设置开机启动2.4 修改密码2.5 设置允许远程连接2.6 重启数据库服务2.7 修改数据库密码 三. 验证参考: 一. 下载PG 官网地址: https://www.postgresql.org/选择Download 选择CentOS 选择对应的版本 …

iOS 单元测试之常用框架 OCMock 详解

目录 前言&#xff1a; 一、单元测试 1.1 单元测试的必要性 1.2 单元测试的目的 1.3 单元测试依赖的两个主要框架 二、OCMock 的集成与使用 2.1 OCMock 的集成方式 2.2 OCMock 的使用方法 2.3 mock使用限制 三、最后 前言&#xff1a; 在iOS开发中&#xff0c;单元测…

OpenCV——实验结果输出《图像基本操作》

1.图像融合 图像融合主要使用的函数为 cv2.addWeighted() #图像融合 # img_cat img_dog #shapes (414,500,3) (429,499,3) img_dog cv2.resize(img_dog,(500,414))#resize函数&#xff0c;不考虑图像形变问题。 print(img_dog.shape) #两张图片的权重相同&#xff0c;gamm…

java编写金字塔

一、实心金字塔 首先&#xff0c;尝试写一个逐层加1个*的金字塔&#xff1a; 可以看出&#xff0c;每一层由空格和*组成&#xff0c;且空格*的总数为底部基石的数量&#xff0c;那么前后空格数就是&#xff08;底部基石数 - 各层星星数&#xff09;*1/2&#xff0c;然后拼接字…

C# 特性(Attribute)总结

目录 特性是什么&#xff1f; 如何使用特性&#xff1f; &#xff08;1&#xff09;.Net 框架预定义特性 &#xff08;2&#xff09;自定义特性 为什么要使用特性&#xff1f; 特性的应用 特性实现枚举展示描述信息 特性是什么&#xff1f; 特性&#xff08;Attribute&…

基于spss的多元统计分析 之 聚类分析+判别分析(2/8)

实验目的&#xff1a; 1&#xff0e;掌握聚类分析及判别分析的基本原理&#xff1b; 2&#xff0e;熟悉掌握SPSS软件进行聚类分析及判别分析的基本操作&#xff1b; 3&#xff0e;利用实验指导的实例数据&#xff0c;上机熟悉聚类分析及判别分析方法。 实验前预习&#xff1a;…

js中原型和原型链的理解(透彻)

js中原型、原型链、继承的理解&#xff08;透彻&#xff09; 1、前言1.1 什么是函数对象1.2 什么是实例对象1.3 什么是原型对象1.4 构造函数、原型对象、实例对象的关系 2、原型3、原型链4、原型的相关属性及方法5、总结 1、前言 1.1 什么是函数对象 函数对象就是我们平时称呼…

centos连接XShell

先设置网络自动连接&#xff0c;为Xshell 连接centos做准备 选择应用程序->系统工具->设置 选择网络&#xff0c;如果有线没有打开&#xff0c;选择打开&#xff0c;在点击设置 记住ipv4地址&#xff0c;选择自动连接&#xff0c;然后应用 最后鼠标右键点击桌面&#xf…

RabbitMQ入门案例之Topic模式

前言&#xff1a; 本文章将介绍RabbitMQ中的Topic&#xff08;主题&#xff09;模式&#xff0c;其中还会涉及 ‘#’ 和 ‘*’ 两个通配符在RabbitMQ中的区别。 官网文档地址&#xff1a;https://rabbitmq.com/getstarted.html 什么是Topic模式 RabbitMQ的Topic模式是一种基于…

SpringBoot 如何使用 Spring Integration 处理事件

SpringBoot 如何使用 Spring Integration 处理事件 Spring Integration 是 Spring Framework 的一个扩展&#xff0c;它提供了一种基于消息传递的集成模式。使用 Spring Integration&#xff0c;我们可以将不同的应用程序、系统和服务连接起来&#xff0c;从而实现数据的传递、…

VMware中Linux虚拟机配置静态ip

一、输入ip addr查看ip地址 二、输入cd /etc/sysconfig/network-scripts进入centos网络配置文件夹 三、接着输入ls查看目录 四、 输入vi ifcfg-ens33进入网卡配置 五、 进入以后是这个界面&#xff0c;红色方框里的内容是需要手动修改的&#xff0c;下面图片里已经修改过了。 …