分治算法: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 ...
随机推荐
- poj1182:食物链
poj1182:食物链 听说是poj中最经典的一道并查集题目.我一做,果然很经典呢!好难啊!!!真的琢磨了很久还弄懂.这道题的重点就在于怎么用并查集表示题目中的关系环. 1. 题干 原题传送门1 原题 ...
- Python基础之PyQt5关闭界面
想让执行完程序后自动关闭窗口,而不用点击右上角叉叉的方法是self.close(),具体应用还是以treewidget为例. 前面我们写了一个treewidget的界面,并且实现了界面代码分离,具体实 ...
- 如何在VeryCD中下载资源
这个方法也是百度来的,记在这里的目的不是为了显摆,主要是担心自己大脑记不住,用的时候又要重新找方法. 操作系统:Linux Mint 17 首先,在VeryCD中看好了某个资源,比如搜索的<哈利 ...
- (Opencv07)绘制边框
(Opencv07)绘制边框 cv2.boundingRect(img) 这个函数可以获得一个图像的最小矩形边框一些信息 cv2.rectangle()可以画出该最小矩形边框 x, y ,w, h = ...
- OpenFaaS实战之四:模板操作(template)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 大数据学习(22)—— ZooKeeper能做些什么
官网上已经给出了zk的几种典型应用场景,原话是这么说的: It exposes a simple set of primitives that distributed applications can ...
- python代码下载m3u8视频
代码如下: # -*- coding: utf-8 -*- import requests import re import os import base64 from Crypto.Cipher i ...
- Cloud-init的安装和使用 --以ubuntu-server-14.04-amd64为例
by hyc 1.Cloud-init安装 已有了一个安装好系统的镜像. 镜像名:ubuntu-test-14.04-server-amd64.img 用户名:user 密码:1 主机名:ubuntu ...
- 软件或jar包版本的小知识---Beta版、Final版、Free版等
对于各种软件或jar包,其后面总有不同的"尾巴",如: 等,刚开始接触的肯定有些不知道.那么他们到底代表什么意思呢? 0.Release:发布版 1.Beta版:产品发布之前的测试 ...
- Groovy正则表达式复杂逻辑判断实例
下面的两个pattern(p1和p2)分别代表了(A or B) and (C or D)和(A and B) or (C and D)的跨行匹配结果,当然还可以用正则表达式构建更复杂的pattern ...