1 public class Tromino { 2 3 static int num = 2; 4 //x 对应 第二维 5 //y 对应 第一维 6 static int[][] panel = { 7 {0,0,0,0,0,0,0,0}, 8 {0,0,0,0,0,0,0,0}, 9 {0,0,0,0,0,0,1,0}, 10 {0,0,0,0,0,0,0,0}, 11 {0,0,0,0,0,0,0,0}, 12 {0,0,0,0,0,0,0,0}, 13 {0,0,0,0,0,0,0,0}, 14 {0,0,0,0,0,0,0,0} 15 }; 16 /*static int[][] panel ={ 17 {0,0},{0,1} 18 };*/ 19 /* 20 * 棋盘大小 2^n * 2^n 21 * 缺失方块的位置 (x, y) 22 * 棋盘的开始位置x0, y0 23 */ 24 public static void cover(int x0, int y0, int x, int y, int size){ 25 int cx = x0 + size / 2 - 1; 26 int cy = y0 + size / 2 - 1; 27 if(size == 2){ 28 if(x0 == x && y0 == y){//左上 29 panel[y0][x0+1] = num; 30 panel[y0+1][x0+1] = num; 31 panel[y0+1][x0] = num; 32 num++; 33 } 34 if(x0+1 == x && y == y0){//右上 35 panel[y0][x0] = num; 36 panel[y0+1][x0+1] = num; 37 panel[y0+1][x0] = num; 38 num++; 39 } 40 if(x0 == x && y == y0 + 1){//左下 41 panel[y0][x0] = num; 42 panel[y0+1][x0+1] = num; 43 panel[y0][x0+1] = num; 44 num++; 45 } 46 if(x0+1 == x && y == y0 + 1){//右下 47 panel[y0][x0] = num; 48 panel[y0][x0+1] = num; 49 panel[y0+1][x0] = num; 50 num++; 51 } 52 print(); 53 return; 54 } 55 56 if( x <= cx && y <= cy){ 57 //左上 58 panel[cy][cx+1] = num; 59 panel[cy+1][cx] = num; 60 panel[cy+1][cx+1] = num; 61 num++; 62 print(); 63 cover(x0, y0, x, y, size/2);//递归左上 64 cover(cx+1, y0, cx+1, cy, size/2);//递归右上 65 cover(x0, cy+1, cx, cy+1, size/2);//递归左下 66 cover(cx+1, cy+1, cx+1, cy+1, size/2);//递归右下 67 } 68 if( x > cx && y > cy){ 69 //右下 70 panel[cy][cx] = num; 71 panel[cy+1][cx] = num; 72 panel[cy][cx+1] = num; 73 num++; 74 print(); 75 cover(x0, y0, cx, cy, size/2);//递归左上 76 cover(cx+1, y0, cx+1, cy, size/2);//递归右上 77 cover(x0, cy+1, cx, cy+1, size/2);//递归左下 78 cover(cx+1, cy+1, x, y, size/2);//递归右下 79 } 80 if( x > cx && y <= cy){ 81 //右上 82 panel[cy][cx] = num; 83 panel[cy+1][cx] = num; 84 panel[cy+1][cx+1] = num; 85 num++; 86 print(); 87 cover(x0, y0, cx, cy, size/2);//递归左上 88 cover(cx+1, y0, x, y, size/2);//递归右上 89 cover(x0, cy+1, cx, cy+1, size/2);//递归左下 90 cover(cx+1, cy+1, cx+1, cy+1, size/2);//递归右下 91 } 92 if( x <= cx && y > cy){ 93 //左下 94 panel[cy][cx] = num; 95 panel[cy][cx+1] = num; 96 panel[cy+1][cx+1] = num; 97 num++; 98 print(); 99 cover(x0, y0, cx, cy, size/2);//递归左上 100 cover(cx+1, y0, cx+1, cy, size/2);//递归右上 101 cover(x0, cy+1, x, y, size/2);//递归左下 102 cover(cx+1, cy+1, cx+1, cy+1, size/2);//递归右下 103 } 104 } 105 public static void print(){ 106 for(int i = 0; i < panel.length; i++){ 107 for(int j = 0; j < panel[i].length; j++){ 108 System.out.printf("%3d", panel[i][j]); 109 } 110 System.out.println(); 111 } 112 System.out.println(); 113 } 114 public static void main(String[] args) { 115 cover(0, 0, 6, 2, 8); 116 //cover(0, 0, 1, 0, 2); 117 print(); 118 } 119 }