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();
        }
    }
}

運行結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章