5-20 世界名画陈列馆问题(不重复监视)
问题描述
世界名画陈列馆由 个排列成矩形阵列的陈列室组成。为了防止名画被盗,需要在陈列室中设置警卫机器人哨位。每个警卫机器人除了监视它所在的陈列室外,还可以监视与 它所在的陈列室相邻的上、下、左、右 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; j<k; j++){
x[2][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; j<k; j++){
x[4*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