递归与分治策略之棋盘覆盖Java实现
递归与分治策略之棋盘覆盖
一、问题描述
二、过程详解
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实现的更多相关文章
- 递归与分治策略之循环赛日程表Java实现
递归与分治策略之循环赛日程表 一.问题描述 设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能参赛一 ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- [图解算法] 二分查找Binary-Search——<递归与分治策略>
#include"iostream.h" int BinarySearch(int a[],int left,int right,const int& x) { if(le ...
- [图解算法]线性时间选择Linear Select——<递归与分治策略>
#include <ctime> #include <iostream> using namespace std; template <class Type> vo ...
- 棋盘覆盖问题 (粉书 P230 【递归】** )
转载自:http://blog.csdn.net/akof1314/article/details/5423608 (赞) 在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其它方格不 ...
- 棋盘覆盖(大数阶乘,大数相除 + java)
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- 棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
- js算法:分治法-棋盘覆盖
在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k> ...
- NYOJ 45 棋盘覆盖 模拟+高精度
题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...
随机推荐
- Python练习-不知道弄个什么鬼
Alex大神,今天丢过来一个PDF,结果就成了这个样子! 1. 执行 Python 脚本的两种方式 交互方式: 命令行 文件方式: ...
- php中路径斜杠的应用,兼容win与linux
更多内容推荐微信公众号,欢迎关注: PHP中斜杠的运用 兼容win和linux 使用常量:DIRECTORY_SEPARATOR如:"www".DIRECTORY_SEPARATO ...
- linux学习记录.3.virtualbox 共享文件夹
需要先安装增强功能. 设置目录后, mkdir /mnt/WinDownload //建立映射目录 sudo mount -t vboxsf Download /mnt/Windwnload ...
- [转]程序进行性能分析工具gprof使用入门
性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...
- spring-boot-CommandLineRunner
在项目服务启动完成后就去加载一些数据 @Component public class MyStartupRunner1 implements CommandLineRunner { @Override ...
- Java NIO 之 Channel(通道)
历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 一 Channel ...
- [Android Studio] Android Studio如何快速生成get,set,tostring,构造函数
刚开始使用Android Studio时,在创建一个javabean时,很习惯的在JavaBean类中,右键去找生成get,set等选项.但是很遗憾,找不到. 那这边如何快速的set,get或者生成构 ...
- mysql中间件 -> Atlas简介&安装
Atlas简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上, ...
- ubuntu 16.04 网卡配置 虚拟机上网
看所有网卡(包括未启动的) ifconfig -a 或者 ip link 查看当前网卡配置,打开配置文件/etc/network/interfaces 设置静态IP(dhcp 为动态获取,static ...
- Python3 出现'ascii' codec can't encode characters问题
当使用urllib.request.urlopen打开包含中文的链接时报错: from urllib import request url = 'https://baike.baidu.com/ite ...