算法设计与分析: 5-20 世界名画陈列馆问题(不重复监视)

该博客介绍了如何设计一个算法解决世界名画陈列馆的问题,即在m×n的陈列馆中,用最少数量的警卫机器人确保每个陈列室被唯一监视。算法采用回溯法来寻找最优解决方案,数据输入包含两个正整数m和n,表示陈列馆的行数和列数。内容引用自王晓东的《计算机算法设计与分析》第三版。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5-20 世界名画陈列馆问题(不重复监视)


问题描述

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

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

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


Java

package Chapter5HuiSuFa;

import java.util.Scanner;

public class ShiJieMingHuaChenLieGuanBuChongFuJianShi {
   
   

    private static int m,n;
    private static int[][] x;
    private static int best;

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        while (true){
            n = input.nextInt();
            m = input.nextInt();

            x = new int[n+1][m+1];

            compute();
        }
    }

    private static void compute(){
        boolean ok = false;
        if(n == 1){
            int k = m/3;
            if(m%3 == 1)
                for(int j=0; j<=k; j++)
                    x[1][3*j+1] = 1;
            else{
                if(m%3 == 0) k--;
                for(int j=0; j<=k; j++)
                    x[1][3*j+
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值