1)问题描述
就是一个棋盘中有一个方格被覆盖成黑色了,其他都是白色,我们要把除了那个黑色方格外的其他白色方格覆盖成黑色。
2)基本思路
就是把棋盘不断地分割成4个,覆盖不包含黑色方格的其他3个,这样不断覆盖下去。
3)代码实现
package test;
import java.util.Arrays;
import java.util.Scanner;
public class laoya {
static int [][]chess; //把整个棋盘当成一个二维数组
static void ChessBoard(int row,int column,int x, int y, int size) { //分治法填满棋盘
if(size == 1) {
return;
}
int s =size/2;
int t = 1;
int centerrow = row+s;
int centercolumn = column+s;
if(x<centerrow && y<centercolumn) { //左上
ChessBoard(row,column,x,y,s);
}
else {
chess[centerrow-1][centercolumn-1] =t;
ChessBoard(row,column,centerrow-1,centercolumn-1,s);
}
if(x<centerrow && y>=centercolumn) { //右上
ChessBoard(row,centercolumn,x,y,s);
}
else {
chess[centerrow-1][centercolumn]=t;
ChessBoard(row,centercolumn,centerrow-1,centercolumn,s);
}
if(x>=centerrow && y<centercolumn) { //左下
ChessBoard(centerrow,column,x,y,s);
}
else {
chess[centerrow][centercolumn-1]=t;
ChessBoard(centerrow,column,centerrow,centercolumn-1,s);
}
if(x>=centerrow && y>=centercolumn) { //右下
ChessBoard(centerrow,centercolumn,x,y,s);
}
else {
chess[centerrow][centercolumn]=t;
ChessBoard(centerrow,centercolumn,centerrow,centercolumn,s);
}
}
public static void main(String[] args) {
Scanner input =new Scanner(System.in); //输入棋盘的大小和黑色方格的位置
System.out.println("请输入x");
int x =input.nextInt();
System.out.println("请输入y");
int y =input.nextInt();
System.out.println("请输入size(size必须是2的倍数)");
int size =input.nextInt();
chess = new int[size][size]; //这样先声明后定义就可以自定义数组的size了
while(size%2!=0) { //当size不是2的倍数的时候的处理
System.out.println("输入的size必须是2的倍数,请重新输入size!");
size = input.nextInt();
}
chess[x][y] =1; //涂黑色方块
System.out.println("覆盖前的棋盘:"); //输出填好前的棋盘
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
System.out.print(chess[i][j]+" ");
}
System.out.println(" ");
}
//分治法填满棋盘
ChessBoard(0,0,x,y,size); //x,y是黑色方块的坐标,size是整个棋盘的长和宽
System.out.println("覆盖后的棋盘:"); //输出填好后的棋盘
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
System.out.print(chess[i][j]+" ");
}
System.out.println(" ");
}
}
}
4)时间复杂度和空间复杂度
时间复杂度
O(4*k)
【4的k次方,k是棋盘的边长】
空间复杂度
O(k*2)