世界名画陈列馆问题
问题描述
世界名画陈列馆由 m × n m\times n m×n个排列成矩形阵列的陈列室组成。为了防止名画被盗,需要在陈列室中设置机器人哨位。每个警卫机器人除了监视它所在的陈列室外,还可以监视与它所在的陈列室相邻的上下左右四个陈列室。试设计一个安排警卫机器人哨位的算法,使名画陈列馆中每一个陈列室都在警卫机器人的监视之下,且所用的警卫机器人人数最少。
数据范围:
1 ≤ m , n ≤ 20 1\leq m,n\leq 20 1≤m,n≤20
解答算法
题目要求使用优先队列式分支限界法
首先设定一个类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(); //弹出堆顶元素