棋盘覆盖问题——Java版
- 原理 :利用递归分治思想 将大问题转化为小问题 进行求解
private static int title = 1;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入k的值");
//其中的输入 K为 2^k
int k = scanner.nextInt();//输入k
int size = 1;
for(int i =0;i<k;i++){
size *= 2;
}
int[][] arr = new int[size][size];
System.out.println("请输入位置坐标");
//坐标为特殊点所在
int x1 = scanner.nextInt();
int y1 = scanner.nextInt();
//调用方法
fugai(arr,0,0,x1,y1,size);
//输出
for(int i =0;i<size;i++){
System.out.println(Arrays.toString(arr[i]));
}
}
public static void fugai(int[][] arr,int x,int y,int x1,int y1,int size){
if(size==1)return;
size = size/2;
int t = title++;
//左上角
if(x1<x+size&&y1<y+size){
fugai(arr,x,y,x1,y1,size);
}else{
arr[x+size-1][y+size-1] = t;
fugai(arr,x,y,x+size-1,y+size-1,size);
}
//右上角
if(x1<x+size&&y1>=y+size){
fugai(arr,x,y+size,x1,y1,size);
}else{
arr[x+size-1][y+size] = t;
fugai(arr,x,y+size,x+size-1,y+size,size);
}
//左下角
if(x1>=x+size&&y1<y+size){
fugai(arr,x+size,y,x1,y1,size);
}else{
arr[x+size][y+size-1] = t;
fugai(arr,x+size,y,x+size,y+size-1,size);
}
//右下角
if(x1>=x+size&&y1>=y+size){
fugai(arr,x+size,y+size,x1,y1,size);
}else{
arr[x+size][y+size] = t;
fugai(arr,x+size,y+size,x+size,y+size,size);
}
}