分治算法:Tromino谜题,L型覆盖
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型覆盖的更多相关文章
- js算法:分治法-棋盘覆盖
在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...
- UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...
- 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】
原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...
- 剑指Offer——分治算法
剑指Offer--分治算法 基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更 ...
- 算法准备-分治算法解决第k位数的线性查找
由作业士兵排队问题引出的 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数最表(x,y)表示.士兵可以沿着网格边上.下.左.右移动一步,但在同一时刻一个网格上只能有一名士兵.按照军官 ...
- 算法(Java实现)—— 分治算法
分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...
- 从两个平方算法到分治算法-java
先来看看问题的来源,假设有这么一个数组: 1 2 -5 4 -2 3 -3 4 -15 我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有 ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
- 敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(中)
这是松结对编程的第22篇(专栏目录). 接前文 业务代码 比较长,基本上就是看被注释隔开的三大段,先显示状态群筛选链接,然后是单个状态筛选,然后是显示下拉框的当前选中项,最后显示下拉框. public ...
随机推荐
- 微信小程序云开发-云存储-上传文件(word/excel/ppt/pdf)到云存储
说明 word/excel/ppt/pdf是从客户端会话选择文件.使用chooseMessageFile中选择文件. 一.wxml文件 上传按钮,绑定chooseFile <!--上传文件(wo ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
- Servlet 单例多线程详解(六)
一.Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
- php header 设置文件下载
控制器 php 代码: $filepath = "http://www.jiesen365.com/uploadfile/20150519044903-897.pdf"; //下载 ...
- Git,Linux,Ubuntu,Tmux的常用命令
常用的连接 Git命令 廖雪峰的Git教程 Git常用命令 ubuntu16.04之GitHub入门教程 Linux相关 tmux命令 Ubuntu常用命令速查手册 Linux 命令大全 其它工具 M ...
- IDEA创建Mapper.xml文件识别不成功的问题
在IDEA的maven项目中,创建一个EmpMapper.xml的文件识别不成功,图标显示为文本文档类型,在写代码时也不会弹出提示 解决方法: 在文件->设置->编辑器->文件类型中 ...
- linux中的dhcp
目录 一.DHCP服务 二.DHCP的租约过程 三.使用DHCP动态配置主机地址 四.安装DHCP服务器 一.DHCP服务 ① DHCP (Dynamic HostConfiguration Prot ...
- 什么是CIDR?
英文缩写: CIDR (Classless InterDomain Routing) 中文译名: 无类别域间路由选择 IP地址有"类"的概念,/8掩码是A类,/16掩码是B类,/2 ...
- Windows服务器如何磁盘分区,Windows服务器磁盘分区常见的三种
原文来自:https://www.sohu.com/a/272133008_100217178 我怕链接会失效,故转载此篇文章,解析得很透彻,一目了然!记录. -------------------- ...
- 手动实现instanceof函数
instanceof 功能 a instanceof b 官方解释为检查构造函数b的prototype 有没有出现在a的原型链上.比如: function A() { } function B() { ...