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

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


问题描述

世界名画陈列馆由 m×n m × 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+2] = 1;
            }
            best = k+1;
            ok = true;
        }

        else if(m == 1){
            int k = n/3;
            if(n%3 == 1)
                for(int j=0; j<=k; j++)
                    x[3*j+1][1] = 1;
            else{
                if(n%3 == 0) k--;
                for(int j=0; j<=k; j++)
                    x[3*j+2][1] = 1;
            }
            best = k+1;
            ok = true;
        }

        else if(n==2 && m%2==1){
            int k = m/4;
            if(m%4 == 1){
                for(int j=0; j<=k; j++){
                    x[1][4*j+1] = 1;
                }
                for(int j=0; j2][4*j+3] = 1;
                }
            }
            if(m%4 == 3){
                for(int j=0; j<=k; j++){
                    x[1][4*j+1] = 1;
                    x[2][4*j+3] = 1;
                }
            }
            best = (m+1)/2;
            ok = true;
        }

        else if(m==2 && n%2==1){
            int k = n/4;
            if(n%4 == 1){
                for(int j=0; j<=k; j++){
                    x[4*j+1][1] = 1;
                }
                for(int j=0; j4*j+3][2] = 1;
                }
            }
            if(n%4 == 3){
                for(int j=0; j<=k; j++){
                    x[4*j+1][1] = 1;
                    x[4*j+3][2] = 1;
                }
            }
            best = (n+1)/2;
            ok = true;
        }

        else if(n==4 && m==4){
            x[1][1] = 1;
            x[1][4] = 1;
            x[4][1] = 1;
            x[4][4] = 1;
            best = 4;
            ok = true;
        }

        if(ok) output();
        else System.out.println("No Solution!");
    }

    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(x[i][j]+" ");
            System.out.println();
        }
    }
}

Input & Output

1 1
1
1 

1 2
1
0 1 

1 3
1
0 1 0 

1 4
2
1 0 0 1 

1 5
2
0 1 0 0 1 

1 6
2
0 1 0 0 1 0 

2 1
1
0 
1 

3 1
1
0 
1 
0 

4 1
2
1 
0 
0 
1 

5 1
2
0 
1 
0 
0 
1 

6 1
2
0 
1 
0 
0 
1 
0 

2 2
No Solution!

2 3
2
1 0 0 
0 0 1 

2 4
No Solution!

2 5
3
1 0 0 0 1 
0 0 1 0 0 

2 6
No Solution!

2 7
4
1 0 0 0 1 0 0 
0 0 1 0 0 0 1 

3 2
2
1 0 
0 0 
0 1 

4 2
No Solution!

5 2
3
1 0 
0 0 
0 1 
0 0 
1 0 

6 2
No Solution!

7 2
4
1 0 
0 0 
0 1 
0 0 
1 0 
0 0 
0 1 

3 3
No Solution!

3 4
No Solution!

3 5
No Solution!

3 6
No Solution!

3 7
No Solution!

4 3
No Solution!

5 3
No Solution!

6 3
No Solution!

7 3
No Solution!

4 4
4
1 0 0 1 
0 0 0 0 
0 0 0 0 
1 0 0 1 

4 5
No Solution!

4 6
No Solution!
4 7
No Solution!

5 4
No Solution!

6 4
No Solution!

7 4
No Solution!

5 5
No Solution!

Reference

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

你可能感兴趣的:(Algorithm,回溯法,计算机算法设计与分析,Java,计算机算法设计与分析)