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 }

分治算法:Tromino谜题,L型覆盖的更多相关文章

  1. js算法:分治法-棋盘覆盖

    在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...

  2. UVA 10245 The Closest Pair Problem 最近点问题 分治算法

    题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...

  3. 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

    原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...

  4. 剑指Offer——分治算法

    剑指Offer--分治算法 基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更 ...

  5. 算法准备-分治算法解决第k位数的线性查找

    由作业士兵排队问题引出的 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数最表(x,y)表示.士兵可以沿着网格边上.下.左.右移动一步,但在同一时刻一个网格上只能有一名士兵.按照军官 ...

  6. 算法(Java实现)—— 分治算法

    分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...

  7. 从两个平方算法到分治算法-java

    先来看看问题的来源,假设有这么一个数组: 1 2 -5 4 -2 3 -3 4 -15 我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有 ...

  8. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

  9. 敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(中)

    这是松结对编程的第22篇(专栏目录). 接前文 业务代码 比较长,基本上就是看被注释隔开的三大段,先显示状态群筛选链接,然后是单个状态筛选,然后是显示下拉框的当前选中项,最后显示下拉框. public ...

随机推荐

  1. 前端开发入门到进阶第三集【js和jquery的执行时间与页面加载的关系】

    https://blog.csdn.net/u014179029/article/details/81603561 [原文链接]:https://www.cnblogs.com/eric-qin/p/ ...

  2. 解决clipboard.js在移动端复制失败的问题

    1.前沿 在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能.功能做好后,一开始无论这pc端还是移动端都能正常使用.突然某一天测出了一个bug:移动端复制失败,pc端是 ...

  3. 分别在Update和FixedUpdate使用GetKeyDown

    测试目的 探究分别在Update和FixedUpdate使用GetKeyDown执行次数,会不同的 测试开始 在Update测试 我们先在Update测试,很正常是一帧重置一下状态,以防止点击一下执行 ...

  4. 微信小程序云开发-云存储的应用-识别银行卡

    一.准备工作 1.创建云函数identify.自定义action=="2"的时候识别银行卡信息. 2.云函数identify中index.js代码 1 const cloud = ...

  5. HCNA Routing&Switching之OSPF度量值和基础配置命令总结

    前文我们了解了OSPF的网络类型,OSPF中的DR和BDR的选举规则.作用等相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15054938.html: ...

  6. node fs-extra文件操作模块的使用(支持同步、异步)

    用法参见:fs-extra

  7. 在js中对属性的操作

    一:访问属性 两种方法: ①:对象名.属性名 function  test(sno,age,sex){      this.sno=sno,      this.age=age, this.sex=s ...

  8. thinkPHP5 5.0.23 远程代码执行漏洞

    修改数据包 POST /index.php?s=captcha HTTP/1.1 Host: 192.168.49.2:8080 User-Agent: Mozilla/5.0 (Macintosh; ...

  9. Jenkins远程命令执行漏洞(CVE-2018-1000861)

    此漏洞没有回显,直接利用orange的exp执行命令反弹shell 工具地址https://github.com/orangetw/awesome-jenkins-rce-2019 web服务器下写1 ...

  10. 【FATE】设置虚拟机固定IP以及免密登录

    一.前期准备 1.VMWare上新建三个Centos7的虚拟机 2.VMWare虚拟机的三种联网方式 1.桥接模式 -- 桥接: 默认使用VMnet0 这一种联网方式最简单,在局域网内,你的主机是怎么 ...