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();
}
}
}
運行結果: