世界名画陈列馆问题

世界名画陈列馆问题

问题描述

世界名画陈列馆由 m × n m\times n m×n个排列成矩形阵列的陈列室组成。为了防止名画被盗,需要在陈列室中设置机器人哨位。每个警卫机器人除了监视它所在的陈列室外,还可以监视与它所在的陈列室相邻的上下左右四个陈列室。试设计一个安排警卫机器人哨位的算法,使名画陈列馆中每一个陈列室都在警卫机器人的监视之下,且所用的警卫机器人人数最少。

数据范围:

1 ≤ m , n ≤ 20 1\leq m,n\leq 20 1m,n20

解答算法

题目要求使用优先队列式分支限界法

首先设定一个类Node,用来存储该问题所进行搜索的树的节点。该问题中用来评估的标准应当是当前已经安排的警卫机器人数目,用来进行优先队列排序的时候,也应当用该标准进行排序。因此重载Node中的<运算符如下:

bool operator<(const Node& a, const Node& b)   //重载小于符号,用来进行优先队列的排序,确保永远是使用机器人最少的节点靠前
{
   
    return a.robotNums > b.robotNums;
}

然后初始化一个节点tmp,然后将其压入优先队列heap中,一次性生成其所有的子节点,将其进行压入heap中,然后把原来的节点tmp弹出heap中,每一次都选取优先队列的top元素。一直这样循环操作,一直到heap为空,或者是当前找到的节点已经观察了陈列室中的所有位置。

while (!heap.empty())   //只要heap不为空,一直进行下去
    {
   
        tmp = heap.top();    //每次取heap的堆顶元素

        if (beenMonitored == m * n)
        {
   
			//如果当前已经监视了所有的房间,那么操作结束
            return;
        }
        else
        {
   
            //生成当前节点tmp的所有可能的子节点,将其加入heap中
        }
        heap.pop();     //弹出堆顶元素
    
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值