递归与分治策略之棋盘覆盖

一、问题描述

二、过程详解

1、棋盘如下图,其中有一特殊方格:16*16

2、第一个分割结果:8*8

3、第二次分割结果:4*4

4、第三次分割结果:2*2

5、第四次分割结果:1*1

6、第一次分割后子棋盘的覆盖效果

三、代码实现

 package cn.com.zfc.everyday.test;

 import java.util.Scanner;

 /**
*
* @title ChessboardCoverage
* @describe 棋盘覆盖:
* 利用分治法,将方形棋盘分成4部分,如果该特殊点在某一部分,我们就去递归他,如果不在某一部分,我们假设一个点为特殊点,同样递归下去,知道全覆盖。
*
* 左上角的子棋盘(若不存在特殊方格):则将该子棋盘右下角的那个方格假设为特殊方格;
* 右上角的子棋盘(若不存在特殊方格):则将该子棋盘左下角的那个方格假设为特殊方格;
* 左下角的子棋盘(若不存在特殊方格):则将该子棋盘右上角的那个方格假设为特殊方格;
* 右下角的子棋盘(若不存在特殊方格):则将该子棋盘左上角的那个方格假设为特殊方格;
* @author 张富昌
* @date 2017年4月9日下午7:36:15
*/
public class ChessboardCoverage {
// 定义棋盘的大小:2^k,需要的骨牌数是:(4^k-1)/3
private static int BOARD_SIZE = 8;
// 定义一个二维数组用来模拟棋盘
private static int[][] board = new int[BOARD_SIZE][BOARD_SIZE];
// 定义一个全局变量,用来记录骨牌的编号
private static int tile = 0; public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("棋盘的大小为:" + BOARD_SIZE);
System.out.println("请输入特殊方格所在的行号:");
int dr = scanner.nextInt();
System.out.println("请输入特殊方格所在的列号:");
int dc = scanner.nextInt();
scanner.close();
// 行号和列号与二位数组的下标相差 1
chessBoard(0, 0, dr - 1, dc - 1, BOARD_SIZE);
System.out.println("特殊方块在第 " + dr + " 行第 " + dc + "列,覆盖后的棋盘:");
// 输出棋盘
printBoard();
} /**
*
* @param tr:棋盘左上角方格的行号
* @param tc:棋盘左上角方格的列号
* @param dr:特殊方格所在的行号
* @param dc:特殊方格所在的列号
* @param size:当前棋盘的大小
*/
private static void chessBoard(int tr, int tc, int dr, int dc, int size) {
/* 1、当前棋盘的大小是 1 就返回 */
if (size == 1) {
return;
}
int t = tile++;
// 分割棋盘,棋盘大小减半
int s = size / 2; /* 2、覆盖左上角子棋盘 */
if (dr < tr + s && dc < tc + s) {
// 特殊方格在此棋盘中
chessBoard(tr, tc, dr, dc, s);
} else {
// 特殊方格不在此棋盘中,用 t 号骨牌覆盖右下角
board[tr + s - 1][tc + s - 1] = t;
// 覆盖其余方格
chessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
} /* 3、覆盖右上角子棋盘 */
if (dr < tr + s && dc >= tc + s) {
// 特殊方格在此棋盘中
chessBoard(tr, tc + s, dr, dc, s);
} else {
// 特殊方格不在此棋盘中,用 t 号骨牌覆盖左下角
board[tr + s - 1][tc + s] = t;
// 覆盖其余方格
chessBoard(tr, tc + s, tr + s - 1, tc + s, s);
} /* 4、覆盖左下角子棋盘 */
if (dr >= tr + s && dc < tc + s) {
// 特殊方格在此棋盘中
chessBoard(tr + s, tc, dr, dc, s);
} else {
// 特殊方格不在此棋盘中,用 t 号骨牌覆盖右上角
board[tr + s][tc + s - 1] = t;
// 覆盖其余方格
chessBoard(tr + s, tc, tr + s, tc + s - 1, s);
} /* 5、覆盖左下角子棋盘 */
if (dr >= tr + s && dc >= tc + s) {
// 特殊方格在此棋盘中
chessBoard(tr + s, tc + s, dr, dc, s);
} else {
// 特殊方格不在此棋盘中,用 t 号骨牌覆盖右上角
board[tr + s][tc + s] = t;
// 覆盖其余方格
chessBoard(tr + s, tc + s, tr + s, tc + s, s);
}
} // 输出棋盘
private static void printBoard() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
System.out.print(board[i][j] + "\t");
}
System.out.println("\n");
}
} }

测试效果:

递归与分治策略之棋盘覆盖Java实现的更多相关文章

  1. 递归与分治策略之循环赛日程表Java实现

    递归与分治策略之循环赛日程表 一.问题描述 设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能参赛一 ...

  2. [图解算法] 归并排序MergeSort——<递归与分治策略>

    #include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...

  3. [图解算法] 二分查找Binary-Search——<递归与分治策略>

    #include"iostream.h" int BinarySearch(int a[],int left,int right,const int& x) { if(le ...

  4. [图解算法]线性时间选择Linear Select——<递归与分治策略>

    #include <ctime> #include <iostream> using namespace std; template <class Type> vo ...

  5. 棋盘覆盖问题 (粉书 P230 【递归】** )

    转载自:http://blog.csdn.net/akof1314/article/details/5423608  (赞) 在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其它方格不 ...

  6. 棋盘覆盖(大数阶乘,大数相除 + java)

    棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...

  7. 棋盘覆盖问题(算法分析)(Java版)

    1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...

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

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

  9. NYOJ 45 棋盘覆盖 模拟+高精度

    题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...

随机推荐

  1. Python概念-Item系列(林海峰教的)

    这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...

  2. JavaScript 优雅的实现方式包含你可能不知道的知识点

    有些东西很好用,但是你未必知道:有些东西你可能用过,但是你未必知道原理. 实现一个目的有多种途径,俗话说,条条大路通罗马.很多内容来自平时的一些收集以及过往博客文章底下的精彩评论,收集整理拓展一波,发 ...

  3. Strusts2笔记8--文件的上传和下载

    文件的和上传和下载: (1)文件的上传: Struts是通过拦截器实现文件上传的,而默认拦截器栈中包含了文件上传拦截器,故表单通过Struts2可直接将文件上传,其底层是通过apache的common ...

  4. PostgreSQL内核分析——BTree索引

    文中附图参考至<PostgreSQL数据库内核分析> (一)概念描述 B+树是一种索引数据结构,其一个特征在于非叶子节点用于描述索引,而叶子节点指向具体的数据存储位置.在PostgreSQ ...

  5. Java集合之Collection与之子类回顾

    Java学习这么久,打算这几天回顾下java的基本知识点,首先是集合. 一.常用集合类关系图 Collection |___List 有序,可重复 |___ArrayList  底层数据结构是数组,增 ...

  6. mysql命令补全工具

    需要在linux中下载mysql插件. 安装mysql插件 yum -y install epel-release python-pip python-devel pip install mycli ...

  7. linux下/var/run目录下.pid文件的作用

    1.pid文件的内容用cat命令查看,可以看到内容只有一行,记录了该进程的ID 2.pid文件的作用防止启动多个进程副本 3.pid文件的原理进程运行后会给.pid文件加一个文件锁,只有获得该锁的进程 ...

  8. Bootstrap FileInput中文API文档

    Bootstrap FileInput中文API整理 这段时间做项目用到bootstrap fileinput插件上传文件,在用的过程中,网上能查到的api都不是很全,所以想着整理一份比较详细的文档, ...

  9. ORA-12514: TNS:listener does not currently know of service …

    问题描述: 今天数据库查询时遇到问题,具体情形如下截图所示: 问题分析: 看错误明显是TNS监听有问题,要么配置错了,要么数据库没起来.但是当前数据库起来了,也能正常连接使用,因此 考虑被查询对象可能 ...

  10. Jquery获取radio单选按钮的value与后面的文字

    一组单选按钮如图: <input name="classId" value="8afa94f45ba3e2c1015ba3fac6c00000" type ...