LeeCode 1728 任意图上博弈

题意

传送门 LeeCode 1728 猫和老鼠 II

题解

任意图上博弈,可参考 Games on arbitrary graphs。具体而言,将博弈双方位置加之先后手状态看作任意图上的一个节点,并根据状态转移建立反图。对于可以确定胜负态的节点,以其为起点,使用类似拓扑序更新的操作不断递推其余节点的状态。对于 n × m n\times m n×m的方格,任意图博弈求解时间复杂度为 O ( ( n m ) 2 max ⁡ ( n , m ) ) O\Big((nm)^{2}\max(n,m)\Big) O((nm)2max(n,m))

#include <bits/stdc++.h>
using namespace std;class Solution {public:bool canMouseWin(vector<string>& grid, int catJump, int mouseJump) {int n = grid.size(), m = grid[0].size();int mx = -1, my = -1;int cx = -1, cy = -1;int fx = -1, fy = -1;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {auto c = grid[i][j];if (c == 'M') {mx = i, my = j;}if (c == 'C') {cx = i, cy = j;}if (c == 'F') {fx = i, fy = j;}}}const vector<int> dx = {0, 0, -1, 1};const vector<int> dy = {-1, 1, 0, 0};int pos_num = n * m;int state_num = pos_num * pos_num * 2;vector<vector<int>> g(state_num);auto get = [&](int u, int v, int who) {return u + v * pos_num + who * pos_num * pos_num;};auto judge = [&](int x, int y) {return 0 <= x && x < n && 0 <= y && y < m && grid[x][y] != '#';};auto ed = [&](int cv, int mv) {int fv = fx * m + fy;return cv == mv || cv == fv || mv == fv;};for (int cv = 0; cv < pos_num; ++cv) {for (int mv = 0; mv < pos_num; ++mv) {if (ed(cv, mv)) {continue;}for (int who = 0; who < 2; ++who) {int w = who == 0 ? cv : mv;int sx = w / m, sy = w % m;int lim = who == 0 ? catJump : mouseJump;for (int k = 0; k < (int)dx.size(); ++k) {int x = sx, y = sy;for (int d = 0; d <= lim; ++d) {if (!judge(x, y)) {break;}if (who == 0) {g[get(x * m + y, mv, who ^ 1)].push_back(get(cv, mv, who));} else {g[get(cv, x * m + y, who ^ 1)].push_back(get(cv, mv, who));}x += dx[k];y += dy[k];}}}}}vector<int> indeg(state_num);for (int u = 0; u < state_num; ++u) {for (int v : g[u]) {indeg[v] += 1;}}vector<int> win(state_num, -1);function<void(int)> dfs = [&](int v) {for (int u : g[v]) {if (win[u] == -1) {if (win[v] == 0) {win[u] = 1;} else {indeg[u] -= 1;if (indeg[u] == 0) {win[u] = 0;}}if (win[u] != -1) {dfs(u);}}}};for (int cv = 0; cv < pos_num; ++cv) {int x = cv / m, y = cv % m;if (judge(x, y)) {for (int who = 0; who < 2; ++who) {int v = get(cv, cv, who);win[v] = who ^ 1;dfs(v);}}}for (int v = 0; v < pos_num; ++v) {int x = v / m, y = v % m;int f = fx * m + fy;if (judge(x, y) && v != f) {int u = get(f, v, 1);win[u] = 0;dfs(u);int w = get(v, f, 0);win[w] = 0;dfs(w);}}int res = win[get(cx * m + cy, mx * m + my, 1)];return res == 1;}
};

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

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

相关文章

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…

自动驾驶系统中的端到端学习

资料下载-《自动驾驶系统中的端到端学习&#xff08;2020&#xff09;》https://mp.weixin.qq.com/s/ttNpsn7qyVWvDMZzluU_pA 近年来&#xff0c;卷积神经网络显著提高了视觉感知能力。实现这一成功的两个主要因素是将简单的模块组合成复杂的网络和端到端的优化。然而&#xf…

电影交流|基于SprinBoot+vue的电影交流平台小程序系统(源码+数据库+文档)

电影交流平台目录 目录 基于SprinBootvue的电影交流平台小程序系统 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 电影信息管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

设备能源数据采集新篇章

在当今这个信息化、智能化的时代&#xff0c;设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天&#xff0c;我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关&#xff01; 一、HiWoo Box网关&#xff1a;一站式解决…

二维码生成器,一站式解决方案,让您的数字生活更便捷

随着科技的飞速发展&#xff0c;二维码已经成为我们日常生活中不可或缺的一部分。无论是支付、身份验证还是信息传递&#xff0c;二维码都以其高效、便捷的特性赢得了广泛的应用。为了满足不同领域的需求&#xff0c;二维码生成器应运而生&#xff0c;为用户提供了一站式的解决…

解决clickhouse 启动报错

解决clickhouse 启动报错 Error response from daemon: driver failed programming external connectivity on endpoint clickhouse-server (b42457434cebe7d8ad024d31e4fd28eae2139bb2b5046c283bea17ce4398d5b0): Error starting userland proxy: listen tcp4 0.0.0.0:8123: …

RocketMQ MQTT 快速搭建验证

来自业务的需求&#xff0c;需要快速搭建一套支持 MQTT 协议的消息系统。 前期准备&#xff1a; 官方地址&#xff1a;https://github.com/apache/rocketmq-mqtt RocketMQ从4.9.3 版本开始才支持该功能&#xff0c;所以需要先检查 RocketMQ 的版本是否满足。 RocketMQ 部署参…

【知识分享】html+js实现系统拍照上传功能

htmljs实现系统拍照上传功能 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"Keywords" content""/><meta name"Description" content""/><meta http-equiv"X…

kube-prometheus部署到 k8s 集群

文章目录 **修改镜像地址****访问配置****修改 Prometheus 的 service****修改 Grafana 的 service****修改 Alertmanager 的 service****安装****Prometheus验证****Alertmanager验证****Grafana验证****卸载****Grafana显示时间问题** 或者配置ingress添加ingress访问grafana…

JAVA前端快速入门基础_javascript入门(02)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 1.JavaScript函数 什么是函数:执行特定任务的代码块 1.1定义&#xff1a; 使用function来进行定义(类似于python里面的def 或者java和c里面的void&#xff0c;int这些返回类型开头)。定义规则如下: func…

物联网D1——建工程,配环境,注意事项

1.STLink、JLink、USB等驱动配置keil环境配置——下载芯片对应型号的包——导入库函数源文件、Core内核文件、对应芯片系统文件。 2.学会看芯片手册 3.在STM32微控制器中&#xff0c;CRH通常指的是控制寄存器高位&#xff08;Control Register High&#xff09;。 在这种情况下…

Linux修改文件权限命令 chmod

【例子引入】 以下面命令为例&#xff1a; chmod 777 Random.py 当写入下面名为Random.py的代码后&#xff1a; 如果直接运行&#xff0c;会显示权限不够 当输入 chmod 777 Random.py 更改权限后&#xff0c;才能够正常运行 在终端中输入 这条命令是关于Linux或Unix-like系…

C++——数据结构stack,queue,priority_queue

栈的底层与使用 1.堆栈是计算机科学中的一种抽象数据类型&#xff0c;只允许在有序的线性数据集合的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行插入数据&#xff08;PUSH&#xff09;和删除数据&#xff08;POP&#xff09;的运算。 2.特点&#xff1a;stac…

[二叉树] 二叉树的前中后三序遍历#知二求一

标题&#xff1a;[二叉树] 二叉树的前中后三序遍历#知二求一 水墨不写bug &#xff08;图片来源于网络&#xff09; 正文开始&#xff1a; 其实这一类题就是考察对二叉树的结构理解&#xff0c;此类题目的二叉树一般通过数组传入&#xff0c;我们只需根据二叉树的就够特点对数…

JAVA同城服务美容美发到店服务上门服务系统源码微信小程序+微信公众号+H5+APP

随着科技的飞速发展&#xff0c;互联网和移动互联网已经渗透到我们生活的方方面面&#xff0c;同城服务美容美发到店服务上门服务系统应运而生&#xff0c;为整个行业带来了巨大的变革和无限的可能。该系统的重要性和优势不言而喻&#xff0c;对于行业发展和用户需求的影响深远…

基于YOLOV8+Pyqt5无人机航拍太阳能电池板检测系统

1.YOLOv8的基本原理 YOLOv8是一种前沿的目标检测技术&#xff0c;它基于先前YOLO版本在目标检测任务上的成功&#xff0c;进一步提升了性能和灵活性&#xff0c;在精度和速度方面都具有尖端性能。在之前YOLO 版本的基础上&#xff0c;YOLOv8 引入了新的功能和优化&#xff0c;…

字符串函数、内存函数——补充

目录 前言 1、strchr函数 1-1 函数介绍 1-1-1 函数功能 1-1-2 函数原型 1-1-3 函数参数 1-1-4 所属库 1-1-5 函数返回值 1-2 函数简单使用 1-3 函数使用场景 1-4 函数的使用总结 1-4-1 注意事项 2、strrchr函数 2-1 函数介绍 2-1-1 函数功能 2-1-2 函数原型 2…

【18】JAVASE-IO专题【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

时间序列分析-无模型

本节内容介绍了无模型的时间序列分析方法&#xff0c;包括时间序列作趋势图、逐年分解、时间序列分解、直方图、ACF与PACF图&#xff0c;主要是作图。 首先导入数据和对应的库&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as plt import se…

与Apollo共创生态:让汽车更聪明,让出行更简单

目录 前言Apollo X 企业解决方案Studio X 企业协同开发工具链Apollo开放平台携手伙伴共创生态Apollo开发平台生态共创计划 前言 百度2013年开始布局自动驾驶&#xff0c;2017年推出全球首个自动驾驶开放平台Apollo。目前百度Apollo已经在自动驾驶、智能汽车、智能地图等领域拥有…