世界名画--陈列馆问题

世界名画--陈列馆问题

  • 问题描述
    • python解答
      • 位操作python代码

问题描述

哨兵布置问题。一个展馆由m×n个矩阵阵列的陈列室组成,需要在陈列室中设立哨位,每个哨位上的哨兵除了可以监视自己所在陈列室外,还可以监视他上、下、左、右四个陈列室,给出一个最佳哨位安排方法,使得所有陈列室都在监视之下,但使用的哨兵最少。

python解答

from queue import PriorityQueue# m*n的房间
m, n = 0, 0
# 自身和上下左右5个方位
position = [(0, 0), (0, 1), (0, -1), (1, 0), (-1, 0)]
# 最优结果 ans为机器人个数 ans_arr为每个机器人的位置
ans_arr = [[0] * 30 for _ in range (30)]
ans = 0class Node:def __init__(self):# 机器人位置self.robot_position = [[0] *( n+2) for _ in range (m+2)]# 被监视的房间位置self.room_watched = [[0] * (n+2) for _ in range (m+2)]# (i,j)为当前遍历到的坐标self.i, self.j = 1, 1# 机器人数   被监视的房间个数self.robotNum, self.roomNum = 0, 0def __lt__(self, other): # 定义比较运算符,按照灯泡数量从大到小排序return self.roomNum > other.roomNum # 返回比较结果# 优先队列,cmp函数会自动执行
q = PriorityQueue ()def init(node):# 初始化robot_position数组全为0node.robot_position = [[0] * (n+2) for _ in range (m+2)]# 初始化room_watched数组全为0node.room_watched = [[0] * (n+2) for _ in range (m+2)]# 当前点在i=1,j=1node.i, node.j = 1, 1# 当前的机器人数;当前的监控房间数node.robotNum, node.roomNum = 0, 0# 在博物馆的上下扩充两行for i in range (m + 2):node.room_watched[i][0] = node.room_watched[i][m + 1] = 1# 在博物馆的左右扩充两列for i in range (n + 2):node.room_watched[0][i] = node.room_watched[n + 1][i] = 1return nodedef setRobot(p, x, y):# 以下几行都是在复制一份快照pnode = Node ()node = init (node)node.i, node.j = p.i, p.jnode.roomNum = p.roomNumnode.robot_position = [row[:] for row in p.robot_position]node.room_watched = [row[:] for row in p.room_watched]# 在(x,y)点新增机器人,机器人数量要+1node.robot_position[x][y] = 1node.robotNum = p.robotNum + 1# 对这个新增机器人的上下左右和自身标记被监控for d in range (5):# pos_x,pos_y表示机器人上下左右位置,我们标记这些位置的房间被监控pos_x = x + position[d][0]pos_y = y + position[d][1]node.room_watched[pos_x][pos_y] += 1# 标记一个房间,roomNum就加一。# 一定要等于1,因为有的房间会被重复监控,那就是2了if node.room_watched[pos_x][pos_y] == 1:node.roomNum += 1# 如果行数不越界 且 当前点被监控了while node.i <= m and node.room_watched[node.i][node.j]:# 当前点的列右移一个单位node.j += 1# 如果右移之后越界了,就换行if node.j > n:node.i += 1node.j = 1# 把当前快照存到优先队列里,会调用cmp排序,保证最顶端的是最优的快照q.put ((node.robotNum, node))def main():global m, n, ans, ans_arr# 输入行列m, n = map (int, input ().split ())# 机器人最多的数量ans = m * n // 3 + 2# 初始化node = Node ()node = init (node)# 快照放入队列q.put ((node.robotNum, node))# 如果队列不空while not q.empty ():# 返回队列第一个p = q.get ()[1]# 如果房间没有全被监控,则分别在当前遍历点的下方、本身、右方放置机器人# 注意这三种情况是互不干扰的,它们会生成三种快照,判断出用机器人最少的一个if p.roomNum < m * n:# 1、在下方放置# 判断条件就是下方有位置可放,不能在最后一行)if p.i < m:setRobot (p, p.i + 1, p.j)# 2、在本身放置。# 第一个判断条件是在它已经没有下方和右方的点的情况下,只能选择自身# 第二个判断条件是它的右边没有被监控if (p.i == m and p.j == n) or p.room_watched[p.i][p.j + 1] == 0:setRobot (p, p.i, p.j)# 3、在右方放置# 第一个判断条件是遍历点右边是没被监控的点# 第二个判断条件是遍历点右边的右边是没有监控的点if p.j < n and (p.room_watched[p.i][p.j + 1] == 0 or p.room_watched[p.i][p.j + 2] == 0):setRobot (p, p.i, p.j + 1)# 如果房间全被监控了elif p.roomNum >= m * n:# 如果已安置的机器人数是目前最少的,更新结果ansif p.robotNum < ans:ans = p.robotNum# 把这种安置方法保存到结果数组ans_arr里面ans_arr = [row[:] for row in p.robot_position]# 打印结果和结果数组print (ans)for i in range (1, m + 1):for j in range (1, n + 1):print (ans_arr[i][j], end=' ')print ()if __name__ == "__main__":main ()

解读连接,大概就是三叉树的意思
只看意思,不需要看代码,他代码有错

位操作python代码

import heapq # 导入堆模块
maxn = 200 # 定义最大的矩阵大小
m, n = 0, 0 # 定义矩阵的行数和列数
ans = 0 # 定义最小的灯泡数量
ans2 = [[0] * maxn for _ in range (maxn)] # 定义一个二维数组,存储每个位置是否有灯泡class Node: # 定义一个类,表示一个状态def __init__(self, set2, loc, sum): # 定义构造函数,接收三个参数self.set2 = [row[:] for row in set2] # set2是一个二维数组,存储每个位置是否被照亮self.loc = loc # loc是当前处理的行数self.sum = sum # sum是当前使用的灯泡数量def __lt__(self, other): # 定义比较运算符,按照灯泡数量从大到小排序return self.sum > other.sum # 返回比较结果def solve(): # 定义一个函数,求解最小的灯泡数量global ans # 声明全局变量q = [] # 定义一个优先队列,存储所有可能的状态ans = 1e7 # 初始化最小的灯泡数量为一个很大的数for i in range (1 << n): # 遍历第一行的所有可能的灯泡分布j = i # 将i转换为二进制表示sum = 0 # 初始化当前使用的灯泡数量为0vis2 = [[0] * maxn for _ in range (maxn)] # 初始化一个二维数组,存储每个位置是否被照亮for s in range (1, n + 1): # 遍历第一行的每一列if j & (1 << (s - 1)): # 如果j的最低位为1,表示在该位置放置一个灯泡if vis2[1][s] == 0: # 如果该位置没有被照亮,就将其标记为1vis2[1][s] = 1if vis2[1][s - 1] == 0: # 如果该位置的左边没有被照亮,就将其标记为2vis2[1][s - 1] = 2if vis2[1][s + 1] == 0: # 如果该位置的右边没有被照亮,就将其标记为2vis2[1][s + 1] = 2if vis2[2][s] == 0: # 如果该位置的下面没有被照亮,就将其标记为2vis2[2][s] = 2sum += 1 # 灯泡数量加一j >>= 1 # 将j右移一位,继续处理下一列t = 1 # 初始化当前处理的行数为1heapq.heappush (q, Node (vis2, t, sum)) # 将当前状态加入优先队列while q: # 当优先队列不为空时,循环处理u = heapq.heappop (q) # 取出优先队列中的最优状态loc = u.loc # 获取当前状态的属性if ans <= u.sum: # 如果当前使用的灯泡数量已经大于等于最小的灯泡数量,就跳过该状态continueif u.loc == m + 1: # 如果当前处理的行数已经超过了矩阵的行数,就检查是否所有位置都被照亮flag = False # 初始化一个标志,表示是否有未被照亮的位置for i in range (1, m + 1): # 遍历矩阵的每一行for j in range (1, n + 1): # 遍历矩阵的每一列if u.set2[i][j] == 0: # 如果发现有未被照亮的位置,就将标志设为True,并跳出循环flag = Truebreakif flag: # 如果已经发现有未被照亮的位置,就跳出循环breakif flag: # 如果有未被照亮的位置,就跳过该状态continueif ans > u.sum: # 如果当前使用的灯泡数量小于最小的灯泡数量,就更新最小的灯泡数量,并复制当前的灯泡分布ans = u.sumfor i in range (maxn): # 遍历最大的矩阵大小for j in range (maxn): # 遍历最大的矩阵大小ans2[i][j] = u.set2[i][j] # 将当前状态的二维数组复制到ans2中for i in range (1, n + 1): # 遍历最后一行的每一列if ans2[m + 1][i] == 1: # 如果最后一行的下面有灯泡,就将最后一行的该位置也放置一个灯泡,并更新最小的灯泡数量ans2[m][i] = 1ans += 1sum = 0 # 初始化一个新的灯泡数量为0se2 = [[0] * maxn for _ in range (maxn)] # 初始化一个新的二维数组,存储每个位置是否被照亮for i in range (m + 1): # 复制当前状态的二维数组for j in range (maxn):se2[i][j] = u.set2[i][j]for i in range (1, n + 1): # 遍历当前处理的行数的每一列if se2[loc][i] == 0: # 如果当前位置没有被照亮,就在该位置放置一个灯泡,并更新相邻位置的照亮情况if se2[loc][i] != 1: # 如果当前位置没有被照亮,就将其标记为1se2[loc][i] = 1if se2[loc + 1][i + 1] != 1: # 如果当前位置的右上角没有被照亮,就将其标记为2se2[loc + 1][i + 1] = 2if se2[loc + 1][i - 1] != 1: # 如果当前位置的左上角没有被照亮,就将其标记为2se2[loc + 1][i - 1] = 2if se2[loc + 1][i] != 1: # 如果当前位置的上面没有被照亮,就将其标记为1se2[loc + 1][i] = 1if se2[loc + 2][i] != 1: # 如果当前位置的上上面没有被照亮,就将其标记为2se2[loc + 2][i] = 2sum += 1 # 新的灯泡数量加一heapq.heappush (q, Node (se2, u.loc + 1, sum + u.sum)) # 将新的状态加入优先队列,处理下一行if __name__ == '__main__': # 定义主函数while True: # 当输入不为0时,循环处理m, n = map (int, input ().split ()) # 读入矩阵的行数和列数if m == 0 and n == 0: # 如果行数和列数都为0,就break # 结束程序ans2 = [[0] * maxn for _ in range (maxn)] # 初始化灯泡分布为全0solve () # 调用求解函数print (ans) # 输出最小的灯泡数量flag = False # 初始化一个标志,表示是否有无解的情况if not flag: # 如果没有无解的情况,就输出灯泡分布for i in range (1, m + 1): # 遍历矩阵的每一行for j in range (1, n + 1): # 遍历矩阵的每一列if ans2[i][j] == 1: # 如果该位置有灯泡,就输出1print ("1 ", end="")else: # 否则,就输出0print ("0 ", end="")print () # 换行print () # 空行else: # 如果有无解的情况,就输出-1print ("-1")

看不懂吧,小老弟

就是遍历每一行的所有情况,判断最小的灯泡数量
其实灯泡也就是哨兵的意思
同时照亮和监控是一个道理

解读连接大概如下
尽量调试代码,从代码入手,你就会懂

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

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

相关文章

C++对C语言数据类型的扩展

1.4 C对C语言数据类型的扩展1.4.1 结构体1.4.2 联合1.4.3 枚举1.4.4 布尔1.4.5 字符串 1.4 C对C语言数据类型的扩展 基本的数据类型 char、unsigned char、int、short、unsigned shor、long、unsigned long、float、double、long double与C语言相同。扩展了bool类型&#xff0…

使用终端启动若依ruoyi

使用终端启动若依ruoyi 01 找到ruoyi-ui文件夹 02 cmd界面两个指令 npm i 下载完成后出现这个界面即为成功 npm run dev 加载结束后出现端口号即可 03 默认账号密码 访问localhost8080可得以上界面默认账号是admin默认密码是damin123

selenium元素定位与操作

说明&#xff1a;本篇博客基于selenium 4.1.0 在selenium中&#xff0c;想要对元素进行操作&#xff0c;一般需要如下步骤&#xff1a; 在浏览器中查看元素属性&#xff0c;便于selenium在页面中找到该元素在代码中创建元素对象元素操作、获取元素信息 查看元素属性 浏览器…

项目实战:自动驾驶之方向盘操纵

项目介绍 根据汽车前方摄像头捕捉的画面,控制汽车方向盘转动的方向和角度,这是自动驾驶要解决的核心问题。这个项目主要是通过使用深度神经网络解决一个回归问题。不同于分类、识别场景,回归问题中神经网络输出的是一个连续的值。 通过这个项目的学习,可以将神经网络用于通…

4070显卡配置ubuntu深度学习环境

本文主要记录一下自己深度学习环境的配置&#xff0c;具体的安装教程有很多&#xff0c;这里就不赘述了。 1.显卡型号 华硕 ATS GeForce RTX4070-o12G-GAMING 2.系统和驱动型号 ubuntu 20.04 显卡驱动版本&#xff1a;NVIDIA-Linux-x86_64-535.129.03.run 3.cuda和cudnn版…

linux常用基础命令

命令 -选项 参数 ls -a[查看隐藏文件] l[以列表形式展示] h[和l一起使用&#xff0c;可显示文件的大小] 参数[可以是任意目录&#xff0c;表示展示任意目录下的内容] mkdir -p[创建多层文件夹时使用] 参数[./test:在当前目录下创建test文件夹] touch 参数[创建任意目录下的文…

【ESP32填坑日记】问题篇⑧ VScode中提示无法使用compilerPath解析配置:“C:/xxx/xtensa-esp32-elf-gcc.exe“

关注星标公众号&#xff0c;不错过精彩内容 作者 | 量子君 微信公众号 | 极客工作室 问题描述 在编译成功&#xff0c;重启之后就编译不成功了&#xff0c;并报如图错误&#xff1a; 无法使用 compilerPath 解析配置&#xff1a;“C:/xxx/xtensa-esp32-elf-gcc.exe” 解决…

【软件工程】软件工程复习题库2023

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; SpringCloud MybatisPlus JVM 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 软件工程复习题库 一、选择题二、填空题三、判断题四…

数据结构 -- 堆

一.堆的概念 1.1 堆是什么 堆也叫做优先队列&#xff0c;一些按照重要性或优先级来组织的对象称为优先队列。 1.2 为什么需要堆 在现实生活中&#xff0c;存在许多需要从一群人、一些任务或一些对象中找出“下一位最重要”目标的情况。例如&#xff1a;在平时处理事情的时候我…

不同版本QT使用qmake时创建QML项目的区别

不同版本QT使用qmake时创建QML项目的区别 文章目录 不同版本QT使用qmake时创建QML项目的区别一、QT5新建QML项目1.1 目录结构1.2 .pro 文件内容1.3 main.cpp1.4 main.qml 二、QT6新建QML项目2.1 目录结构2.2 .pro文件内容2.3 main.cpp2.4 main.qml 三、两个版本使用资源文件的区…

鼠标响应突然不灵敏的检查方法

鼠标突然响应缓慢或者失灵&#xff0c;如下检测步骤&#xff1a; 1、首先排查电源问题&#xff0c;更换电池或者充电&#xff1b; 2、观察光标移动响应、鼠标左键响应、鼠标右键响应、鼠标滚轮等操作&#xff0c;哪些正常&#xff0c;哪些异常。 2、把鼠标接到别的机器上实验…

electron环境安装

electron环境安装 (一)、安装Nodejs、cnpm和git: 1、node.js下载和安装 下载地址&#xff1a;https://nodejs.org/en 下载文件为&#xff1a;node-v20.10.0-x64.msi Latest LTS Version: 20.10.0 (includes npm 10.2.3) 安装到 d:\nodejs\ 目录下 如果打勾自动安装附加工具&…

[Kubernetes]3. k8s集群Service详解

在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…

2023-12-19 AIGC-Stable Diffusion模型的下载方法汇总

摘要: 2023-12-19 AIGC-Stable Diffusion模型的下载方法汇总 Stable Diffusion模型 C站 如果你正在寻找Stable Diffusion模型&#xff0c;C站&#xff08;https://civitai.com&#xff09;是一个值得关注的平台。在这里&#xff0c;你可以找到各种版本的模型&#xff0c;满足…

✺ch5——纹理贴图

目录 加载纹理图像文件纹理坐标在着色器中使用纹理&#xff1a;采样器变量和纹理单元纹理贴图&#xff1a;示例程序多级渐远纹理贴图各向异性过滤环绕和平铺透视变形材质——更多OpenGL细节补充说明 纹理贴图是在栅格化的模型表面上覆盖图像的技术。 它是为渲染场景添加真实感的…

functools.partial:Python中灵活函数部分应用的工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python编程中&#xff0c;functools.partial是一个强大的工具&#xff0c;它提供了一种部分应用函数的方式&#xff0c;能够在创建新函数时固定部分参数&#xff0c;从而在后续调用中减少需要传递的参数数量。…

Python四种配色方案,适合科研的配色

1、Plasma&#xff08;等高线图颜色&#xff09;2、Inferno&#xff08;黑热图颜色&#xff09;3、Cividis&#xff08;较好的配色方案&#xff0c;适用于色盲&#xff09;4、Viridis&#xff08;绿色主导的配色方案&#xff09; 下面这四种配色是不需要指定的&#xff0c;Pyth…

element组件库的日期选择器如何限制?

本次项目中涉及到根据日期查找出来的数据进行调整,所以修改的数据必须是查找范围内的数据.需要对调整数据的日期进行限制,效果如下: 首先我们使用了element 组件库的日期选择器,其中灌完介绍, picker-options中函数disabledDate可以设置禁用状态,代码如下: <el-date-pickerv…

关于GPU使用过程中的若干问题

1.CUDA异常 问题描述&#xff1a;运行torch.cuda.is_available() 报错&#xff1a;cuda unknown error - this may be due to an incorrectly set up environment解决方案&#xff1a;重启 2.nvidia驱动版本不匹配 问题描述&#xff1a;运行nvidis-smi 报错&#xff1a;Fa…

个人用户的数据之美:数据可视化助力解读

数据可视化是一种强大的工具&#xff0c;不仅可以为企业和专业人士提供见解&#xff0c;也对个人用户带来了许多实际的帮助。下面我就以一个数据可视化从业者的视角&#xff0c;来谈谈数据可视化对个人用户的益处&#xff1a; 首先对于个人用户来说&#xff0c;数据可视化可以让…