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

一、问题描述

二、过程详解

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. Vue的生命周期的介绍

    [推荐链接] https://segmentfault.com/a/1190000008010666

  2. webpack4.5.0+vue2.5.16+vue-loader 实战组件化开发案例以及版本问题中踩的一些大坑!!!

    一 vue-loader 我们先不管脚手架,只说vue-loader,简单讲就是可将.vue文件打包,实现组件化开发,即一个.vue文件就是一个组件,开发中只需要引入这个.vue组件就可以了! 然后. ...

  3. 41 - 数据库-pymysql41 - 数据库-pymysql-DBUtils

    目录 1 Python操作数据库 2 安装模块 3 基本使用 3.1 创建一个连接 3.2 连接数据库 3.3 游标 3.3.1 利用游标操作数据库 3.3.2 事务管理 3.3.3 执行SQL语句 ...

  4. 吾修叫板微软,QMVC说比MVC5快!

    前段时间发一篇文章,是关于QMVC介绍的文章,有网友建议写篇关于测试结果的文章.毕竟QMVC是开源的,并且是倾向于性能级开发的,因为我实在不喜欢MVC5还采用跟web form一样的开发风格,不停的封 ...

  5. 玩玩 Nginx 1----- Nginx + ngx_lua安装测试【CentOs下】

          最近打算搞搞nginx,扒着各位先驱的文章自己进行测试下,中间过程也是错误不断,记录一下,以备使用.       nginx的安装挺简单的,主要还是研究下一些第三方的模块,首先想试下初始化 ...

  6. Android Studio配置opencv

    安装过程参考:http://www.cnblogs.com/tail/p/4618476.html demo参考:http://blog.csdn.net/gao_chun/article/detai ...

  7. YUI Compressor 压缩 JavaScript 原理-《转载》

    YUI Compressor 压缩 JavaScript 的内容包括: 移除注释 移除额外的空格 细微优化 标识符替换(Identifier Replacement) YUI Compressor包括 ...

  8. thinkphp调试

    Sql调试

  9. POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

    题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...

  10. Es官方文档整理-2.分片内部原理

    Es官方文档整理-2.分片内部原理 1.集群      一个运行的Elasticsearch实例被称为一个节点,而集群是有一个或多个拥有相同claster.name配置的节点组成,他们共同承担数据和负 ...