问题描述

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

算法设计

设计一个算法,计算警卫机器人的最佳哨位安排方案,使名画陈列馆中每个陈列室仅受一个警卫机器人监视。且所使用的警卫机器人数最少。

数据输入

由文件Input.txt提供输入数据。文件的第1行有2个正整数m和n(1<=m,n<=20)。

结果输出

将计算的警卫机器人数及其最佳哨位安排输出到文件output.txt。文件的第一行是警卫机器人数:接下来的m行中每行n个数,0表示无哨位,1表示哨位。如果不存在满足要求的哨位安排方案,则输出“No Solution!”。

算法分析

在m*n个方格中,我们赋予每个位置(i,j)一个变量monitor,如果该位置被监视或者被摆放了机器人,我们就将该坐标设置成1,而monitor[ i ][ j ] = 0,表示该位置没有被监视。

我们开始从头遍历,如果该位置为空,且上下左右没有机器人,可以摆放机器人,我们就进行摆放,并且将该位置,以及该位置上下左右的monitor[ ][ ]设置成 1 ,然后继续遍历下一个位置,一直到遍历结束,我们使用检查函数(checkAllRoom),来判断是否满足全部不重复监视的条件,满足条件后,我们记录下该数据。但是我们需要最小的情况,就需要进行回溯,就是,将摆放的机器人去除,并用checkAllRoom来检查是否合理,一直遍历到最后一个,如果不摆可以成功,那么,最佳安排的岗位就可以更新,最后打印输出即可。

全部代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<time.h>
#include <climits>
#define MAX 30
int m, n, best;//m*n,最优解的机器人数
int robots[MAX][MAX];//表示警卫机器人情况
int bestRobots[MAX][MAX];//存放当前最优的机器人安排情况
int monitor[MAX][MAX];//表示受监视情况//从文件中读取m,n
void readFile()
{FILE* f = fopen("C:\\Users\\lenovo\\Desktop\\input.txt", "r");if (f == NULL){printf("读取文件错误");return;}fscanf_s(f, "%d%d", &m, &n);fclose(f);
}//初始化数据
void initData()
{best = INT_MAX;memset(monitor, 0, sizeof(monitor));memset(robots, 0, sizeof(robots));
}//在控制台输出机器人安排情况并打印到文件中
void printArrange()
{FILE* file = fopen("C:\\Users\\lenovo\\Desktop\\output.txt", "w");printf("\n");for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){printf("%2d", bestRobots[i][j]);fprintf(file, "%2d", bestRobots[i][j]);}printf("\n");fprintf(file, "\n");}fclose(file);
}//检查是否全部被监视
bool checkAllRooms()
{for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){if (monitor[i][j] == 0){return false;}}}return true;
}//剪枝函数,是否可以不放
bool canKeepUnsafe(int x, int y)
{if (monitor[x][y - 1] == 0)return false;if (y == n){if (y > 0 && monitor[x][y - 1] == 0)return false;if (y = n && monitor[x][y] == 0)return false;}
}//安排机器人监视陈列室
void arrangeRobots(int x, int y, int robot)
{if (robot > best)//剪枝return;if (x == m + 1)//安排完了所有的陈列室{if (checkAllRooms() && robot < best)              //如果所有的陈列室都被监控且所用的机器人数少于之前的最小机器人数{best = robot;memcpy(bestRobots, robots, sizeof(robots));   //将当前的机器人摆放情况复制存入bestRobots}return;}//如果可以摆放机器人if (monitor[x][y] == 0 && monitor[x - 1][y] == 0 && monitor[x][y - 1] == 0 &&monitor[x][y + 1] == 0 && monitor[x + 1][y] == 0){//在这里摆放一个机器人robots[x][y] = 1;robot++;monitor[x][y] = 1;monitor[x - 1][y] = 1;monitor[x][y - 1] = 1;monitor[x + 1][y] = 1;monitor[x][y + 1] = 1;//遍历下一个陈列室if (y < n){arrangeRobots(x, y + 1, robot);}else{arrangeRobots(x + 1, 1, robot);}//回溯,撤销刚才摆放的机器人robots[x][y] = 0;robot--;monitor[x][y] = 0;monitor[x - 1][y] = 0;monitor[x][y - 1] = 0;monitor[x + 1][y] = 0;monitor[x][y + 1] = 0;}//不摆,直接考虑下一个陈列室if (canKeepUnsafe)//剪枝,如果可以不摆的话{if (y < n){arrangeRobots(x, y + 1, robot);}else{arrangeRobots(x + 1, 1, robot);}}
}int main()
{readFile();initData();arrangeRobots(1, 1, 0);if (best == INT_MAX)                     //如果最终best仍然未INT_MAX表示没有方案{printf("no solution!");}else{printf("机器人的最佳哨位安排:%d", best);printArrange();}return 0;
}

代码参考了其他作者。。。

世界名画陈列馆问题(不重复监视)相关推荐

  1. 世界名画陈列馆(最少机器人问题和不重复监视问题)

    问题描述: 世界名画陈列馆问题.世界名画陈列馆由m×n个排列成矩形阵列的陈列室组成.为了防止名画被盗,需要在陈列室中设置警卫机器人哨位.每个警卫机器人除了监视它所在的陈列室外,还可以监视与它所在的陈列 ...

  2. 算法设计与分析: 5-19 世界名画陈列馆问题

    5-19 世界名画陈列馆问题 问题描述 世界名画陈列馆由 m×nm×n m \times n 个排列成矩形阵列的陈列室组成.为了防止名画被盗,需要在陈列室中设置警卫机器人哨位.每个警卫机器人除了监视它 ...

  3. 算法设计三(4)——世界名画陈列馆问题

    pan.baidu.com/s/1w-VSMWmr9ntEWWdxZoD4Yw  码:jnlh 算法分析与设计 时间 2020.5.17 实验名称 世界名画陈列馆问题 实验目的 通过上机实验,要求深层 ...

  4. 算法分析课设(十一)博物馆守卫问题、世界名画陈列馆问题(分支界限法)

    免责声明 不想打字了.. 题目 在某博物馆中摆放了非常重要的文物,为了节省人力,该博物馆专门购买了警卫机器人来看管这些文物.该博物馆的房间排列整齐,房间的大小相同.每个警卫机器人能够巡查的范围除本身所 ...

  5. 计算机画家的阅读答案,计算机眼中的世界名画

    原标题:计算机眼中的世界名画 <蒙娜丽莎>是文艺复兴时代画家列奥纳多·达·芬奇所绘的丽莎·盖拉尔迪尼的肖像画.它具有超高的艺术价值和收藏价值,所以人们对它的仿造也一直没有停止过.对于名家艺 ...

  6. 博物馆守卫问题(世界名画展览馆)

    世界名画展览馆(博物馆守卫问题) 在某博物馆中摆放了非常重要的文物,为了节省人力,该博物馆专门购买了警卫机器人来看管这些文物.该博物馆的房间排列整齐,房间的大小相同.每个警卫机器人能够巡查的范围除本身 ...

  7. Processing粒子系统-用烟雾画出来的世界名画

    Processing粒子系统-烟雾画出来的世界名画 目录: 效果欣赏 参考示例 程序思想以及代码实现 作者有话说 效果欣赏 注:烟雾的的扩散方向随着鼠标位置的不同而不同,构成烟雾的基础图元可以是普通几 ...

  8. python画自己的名字_Python+OpenCV 十几行代码模仿世界名画

    原标题:Python+OpenCV 十几行代码模仿世界名画 现在很多人都喜欢拍照(自拍).有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma.versa 等, ...

  9. 人脸识别撞脸名画_测测自己的自拍最像哪幅世界名画?谷歌这款App逆天了

    原标题:测测自己的自拍最像哪幅世界名画?谷歌这款App逆天了 一款匹配人脸与著名画作的谷歌APP在周末引发了一波自拍狂潮. 本周末,谷歌旗下的数字博物馆App,Google Arts and Cult ...

最新文章

  1. Java学习_day009面向对象(oop):对象和类(下)
  2. [转载] 大道至简:软件工程实践者的思想——第六章 谁是解结的人
  3. 短小强悍的JavaScript异步调用库
  4. java lambda例子_Java lambda 表达式常用示例
  5. sql server简单查询
  6. 《大数据》2020年第6期目次摘要
  7. 牛逼哄哄的 MQ 到底有啥用?
  8. 湖首大学计算机科学硕士申请,湖首大学王牌专业之一丨计算机科学专业
  9. 云服务器与传统服务器的优劣对比_为什么选择海外云服务器和香港云服务器
  10. 电商促销页面需要的辅助图形给设计师准备好了,拿走!
  11. mysql mac版本_mysql的安装、启动和基础配置 —— mac版本
  12. java 设置组件填充_Java学习笔记(三)Java2D组件
  13. catti二级笔译综合能力真题_2006年-2011年CATTI二级笔译综合能力试题及答案2018年.doc...
  14. NavicatPremium-Mac-无法打开问题
  15. h5前端 调用手机通讯录
  16. 组网[ZeroTier]+自建Moon服务
  17. 别错过 孩子学19种才艺的最佳年龄
  18. android操作蓝牙打印机(上)
  19. 泾阳县副县长崔巍领导一行莅临秦储指导交流
  20. SQL14 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。

热门文章

  1. java方法调用之单分派与多分派(二)
  2. Golang 023. 《孙子算经》之鸡兔同笼
  3. 大乐透号码(随机生成)
  4. jdk8新特性之lam表达式的4个基本方法及::运算符
  5. 达林顿驱动器ULN2003,ULN2803使用注意要点
  6. 红米k40和红米k30至尊版参数对比哪个好 哪个更值得入手
  7. 机器学习笔记之十七——VC dimension
  8. 如何制作相册?Mac电脑如何对照片进行管理分类?
  9. MTK |Android KKL 平台TP调试
  10. 剑指Offer-Java刷题个人题解与总结