世界名画展览馆(博物馆守卫问题)
在某博物馆中摆放了非常重要的文物,为了节省人力,该博物馆专门购买了警卫机器人来看管这些文物。该博物馆的房间排列整齐,房间的大小相同。每个警卫机器人能够巡查的范围除本身所在房间外,还包括其起始安放的房间的上下左右四个房间。为了减少摆放的机器人的数量,请你设计一种最佳的摆放方案,使得摆放的机器人数量最少。
输入:
输入一行,有两个整数m,n,分别表示该博物馆每行的房间数和每列的房间数。博物馆总房间数即为m*n。
输出:
输出的第一行表示需要的机器人的数量,其后m行,每行有n个元素,每个元素的值为0或1,分别表示对应的房间是否摆放机器人。0表示不摆放,1表示需要摆放。
样例输入:
4 4
样例输出:
4
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
对于此题有不少的解法,以下代码属于时间复杂度较高的一种做法,使用的优先队列,但如果输入5x5的话可能跑不起来,仅用于自己学习。
未经作者授权,禁止转载或作他用。
#include"algorithm.h"
#include<queue>
#define max 100
using namespace std;
int col = 0;
int row = 0;
int board[max][max];
// 记录最优的放置个数: n*m/3 - 1
int best;
int ans_; // 记录个数
int ans2[max][max];
struct node {
// 棋牌的状态,
// board[i][j]=0 表示没有任何处理,
// = 1 放置守卫
// = 2 被监视
int board[max][max];
int x, y; // 当前守卫放置的位置
int sum; // 守卫的总个数
node(int board[max][max], int x, int y, int sum) {
for (int i = 0; i < row; i++) {
for (int j =