5-19 世界名画陈列馆问题


问题描述

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

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

数据输入:
第一行有 2 个正整数 m 和 n (1≤m,n≤20)。


Java

package Chapter5HuiSuFa;import java.util.Arrays;
import java.util.Scanner;public class ShiJieMingHuaChenLieGuan {private static int MAX = 1000000;private static int MLEN = 50;private static int m,n;private static int[][] d = {{0,0,0},{0,0,0},{0,0,-1},{0,-1,0},{0,0,1},{0,1,0}};private static int[][] x,y,bestx;private static int best,k,t,t1,t2,more;public static void main(String[] args){Scanner input = new Scanner(System.in);while (true){k = 0;t = 0;n = input.nextInt();m = input.nextInt();x = new int[MLEN+1][MLEN+1];y = new int[MLEN+1][MLEN+1];bestx = new int[MLEN+1][MLEN+1];compute();}}private static void compute(){more = m/4+1;if(m%4 == 3) more++;else if(m%4 == 2) more+=2;t2 = m*n+more+4;t1 = m*n+4;best = MAX;if((n==1) && (m==1)){System.out.println(1);System.out.println(1);return;}for(int i=0; i<=m+1; i++){y[0][i] = 1;y[n+1][i] = 1;}for(int i=0; i<=m+1; i++){y[i][0] = 1;y[i][m+1] = 1;}search(1,0);output();}private static void search(int i, int j){do{j++;if(j > m) { i++; j=1; }}while (!((y[i][j]==0) || (i>n)));if(i > n){if(k < best) { best=k; copy(bestx,x); }return;}if(k+(t1-t)/5 >= best) return;if((i<n-1) && (k+(t2-t)/5)>=best) return;if(i < n){change(i+1,j);search(i,j);restore(i+1,j);}if((j<m) && ((y[i][j+1]==0) || (y[i][j+2]==0))){change(i,j+1);search(i,j);restore(i,j+1);}if((y[i+1][j]==0) && (y[i][j+1]==0)){change(i,j);search(i,j);restore(i,j);}}private static void change(int i, int j){x[i][j] = 1; k++;for(int s=1; s<=5; s++){int p = i+d[s][1];int q = j+d[s][2];y[p][q]++;if(y[p][q]==1) t++;}}private static void restore(int i, int j){x[i][j] = 0; k--;for(int s=1; s<=5; s++){int p = i+d[s][1];int q = j+d[s][2];y[p][q]--;if(y[p][q]==0) t--;}}private static void copy(int[][] des, int[][] src){for(int i=0; i<src.length; i++)des[i] = Arrays.copyOf(src[i],src[i].length);}private static void output(){System.out.println(best);for(int i=1; i<=n; i++){for(int j=1; j<=m; j++)System.out.print(bestx[i][j]+" ");System.out.println();}}
}

Input & Output

4 4
4
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0 8 13
26
0 0 0 0 1 0 0 0 1 0 0 1 0
1 1 1 0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 1 1 0 1
0 0 1 0 0 0 0 1 0 0 0 0 0
1 0 0 0 0 1 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 1 1 0 0 0
0 1 0 0 0 0 1 0 0 0 0 0 1
0 1 0 0 1 0 0 0 1 0 1 0 0 

Reference

王晓东《计算机算法设计与分析》(第3版)P186

算法设计与分析: 5-19 世界名画陈列馆问题相关推荐

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

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

  2. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

  3. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感

    <算法设计与分析基础>是一本由Anany levitin著作,清华大学出版社出版的胶版纸图书,本书定价:49.00元,页数:409,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助 ...

  4. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  5. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  6. C++算法设计与分析课后习题(第三章)

    C++算法设计与分析课后习题[第三章] 前言 一.求2+22+222+2222+...+22...(n个2)...22(精确计算) 变量解释 运行截图 二.编写一个算法,其功能是给一维数组a输入任意6 ...

  7. 算法设计与分析(python版)-作业一

    参考教材:算法设计与分析(Python版)         作者:王秋芬 1 . 容易 (4分)2 n=O(100n ^2) 错误 2 . 容易 (3分)10=θ(log10) 正确 3 . 容易 ( ...

  8. 算法设计与分析: 5-22 魔方(Rubik's Cube)问题

    5-22 魔方(Rubik's Cube)问题 问题描述 3×3×33×3×33\times3\times3 魔方的构造如图所示.图中英文字母 U,L,F,R,B,D 分别表示魔方的 6 个面中的上面 ...

  9. 算法设计与分析(python版)-作业三

    参考教材:算法设计与分析(Python版)         作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...

最新文章

  1. ASP.net中的几种分页方法
  2. php引用地址,关于php的引用
  3. LeetCode 64. Minimum Path Sum(最小和的路径)
  4. new和make的区别
  5. 学渣笔记之矩阵的导数与迹
  6. HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题
  7. linux bash tutorial
  8. 为资产分类定义折旧范围_RFID固定资产管理系统方案
  9. 计算机网络 第三章 数据链路层
  10. 祝贺软件工程成了国家一级学科
  11. 程序 卡塔_建筑钉卡塔
  12. OPPO R17在哪里打开usb调试模式的完美流程
  13. ArcEngine ICoommand和ITool 的区别
  14. 《操作系统导论》吐血万字整理 - 附下载地址及思维导图
  15. 云服务器ecs是虚拟机,云服务器ecs虚拟机
  16. Chrome浏览器更新
  17. 零和博弈中范式概率的计算
  18. python语句分号_【判断题】Python程序中每条语句以分号结尾。 A. 正确 B. 错误
  19. Android 曝光采集,商品view曝光量的统计,判断RecyclerView中某子view是否可见 view是否显示在屏幕中 view展示次数统计...
  20. Ubuntu中可以卸载的软件(持续更新)

热门文章

  1. Python Web集成Prometheus
  2. domtoimage截屏报错Uncaught(in promise)
  3. flink Could not acquire the minimum required resources
  4. 利用H5Canvas进行前端图片压缩再上传笔记
  5. Pycharm打开(打印)大数据文件显示不全的解决方法
  6. 点击dgv某列的单元格时触发事件的方法
  7. android studio 导入工程问题总结
  8. 最新研究!美国爱荷华州立大学利用量子计算模拟原子核
  9. appium开启两个服务端口链接两个模拟机,但每次都只运行一台设备。终于解决。
  10. Flink从入门到精通系列(四)