Java世界名画陈列馆——不重复监视问题

package com.tulun.suanfa;
import java.util.LinkedList;

import java.util.Scanner;

/**
 * '◎' 没有被监视
 * '*' 被监视
 * '※' 机器人放置位置
 * '—''|' 围墙
 * 
 * @author lzq
 *
 */
public class ShiJieMingHua {
    /**
     * 声明一个char类型的二维数组
     */
    static char[][] array;
    /**
     * 建立有边界的二维数组
     * @param length
     * @param width
     */
    public static char[][] new_2Array(int length,int width){
        array = new char[length+2][width+2];
        for (int i = 0; i < length+2; i++) {
            for (int j = 0; j < width+2; j++) {
                array[i][j] = '◎';
            }
        }
        for (int i = 0; i < length + 2; ++i){
            if (i == 0 || i == length + 1){
                for (int j = 0; j < width + 2; ++j){
                    array[i][j] = '—';
                }
            }else{
                if(i != 0 || i != length + 1) {
                array[i][0] = '|';
                array[i][width + 1] = '|';  
                }
            }
        }
        return array;
    }
    /**
     * 判断此位置是否可以放置警卫
     * @param array
     * @param i
     * @param j
     * @return
     */
    public static boolean isPut(int i,int j){
        if (array[i][j] == '◎' && array[i - 1][j] != '*' && array[i][j - 1] != '*'
                && array[i + 1][j] !='*' && array[i][j + 1] != '*'){
            return true;
        }       
        return false;
    }
    /**
     * 设置警卫并且改变相应的值
     * @param array
     * @param i
     * @param j
     */
    public static void set(int i,int j){
        /**
         * 此位置放置警卫
         */
        array[i][j] = '※';
        /**
         * 改变放置警卫能侦测到位置的值
         */
        if (array[i - 1][j] == '◎') array[i - 1][j] = '*';
        if (array[i][j - 1] == '◎') array[i][j - 1] = '*';
        if (array[i][j + 1] == '◎') array[i][j + 1] = '*';
        if (array[i + 1][j] == '◎') array[i + 1][j] = '*';
    }
    /**
     * 检查是否全部填满
     * @param array
     * @param length
     * @param width
     * @return
     */
    public static boolean check(int length,int width){
        for (int i = 1; i <= length;++i)
        {
            for (int k = 1; k <= width; ++k)
            {
                if (array[i][k] == '◎')
                {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * 全部回退
     * @param array
     * @param length
     * @param width
     */
    public static void goBack(int length,int width){
        for (int i = 1; i <= length; ++i)
        {
            for (int k = 1; k <= width; ++k)
            {
                array[i][k] = '◎';
            }
        }
    }
    /**
     * 警卫位置的填入
     * @param array
     * @param x
     * @param y
     * @param length
     * @param width
     */
    public static void insert(int x,int y,int length,int width){
        /**
         * 判断此位置是否越界
         */
        if (x > length || y > width){
            return;
        }   
        /**
         * 判断此位置是否合适放置
         * 如果合适,设置警卫并且改变相应的值
         */
        if (isPut(x, y)){
            set(x, y);
        }   
        /**
         * 到下一行接着放置
         */
        if (y == width){
            insert(x+1,1,length,width);
        }else{
            insert(x,y+1,length,width);
        }   
    }
    /**
     * 逐一添置警卫
     * @param array
     * @param length
     * @param width
     */
    public static void insert1(int length,int width){
        for (int i = 1; i <= length;++i)
        {
            for (int j = 1; j <= width;++j)
            {
                /**
                 * 往i,j位置添加
                 */
                insert(i,j,length,width);
                /**
                 * 判断是否填满
                 */
                if (check(length,width)){
                    break;
                }
                /**
                 * 回退
                 */
                goBack(length,width);
            }
        }
    }
    /**
     * 打印二维数组元素
     * @param array
     */
    public static void show2(){
        for(char[] brr: array){
            for(char i:brr){
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        for(;;) {
        System.out.println("设置陈列馆:");
        System.out.print("行数m: ");
        Scanner sc1=new Scanner(System.in);
        int m = Integer.parseInt(sc1.next());
        System.out.print("列数n: ");
        sc1=new Scanner(System.in);
        int n=Integer.parseInt(sc1.next());
        new_2Array(m,n);
        insert1(m,n);
        show2();
        }
    }
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/82145040