棋盘覆盖问题 java_Java基于分治算法实现的棋盘覆盖问题示例
本文实例讲述了Java基于分治算法实现的棋盘覆盖问题。分享给大家供大家参考,具体如下:
在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四个L型骨牌如下图:
棋盘中的特殊方格如图:
实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图所示:
具体代码如下:
package demo;
public class Chess {
/*tr表示棋盘左上角行号
tc表示棋盘左上角列号
dr表示特殊棋盘的行号
dc表示特殊棋盘的列号*/
public static void ChessBoard(int tr, int tc, int dr, int dc, int size) {
if(size == 1) {
return;
}
int t = title ++;
int s = size/2;
//覆盖左上角子棋盘
if(dr < tr + s && dc < tc +s) {
//特殊方格在此棋盘中
ChessBoard(tr, tc, dr, dc, s);
}
else {
//此棋盘中无特殊方格,用t号L型骨牌覆盖右下角
Board[tr + s - 1][tr + s -1] = t;
//覆盖其余方格
ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
}
//覆盖右上角子棋盘
if(dr < tr + s && dc >= tc + s) {
//特殊方格在此棋盘中
ChessBoard(tr, tc+s, dr, dc, s);
}
else {//此棋盘中午特殊方格,用t号L型骨牌覆盖左下角
Board[tr + s - 1][tc + s] = t;
//覆盖其余方格
ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);
}
//覆盖左下角子棋盘
if(dr >= tr + s && dc < tc +s) {
//特殊方格在此棋盘中
ChessBoard(tr + s, tc, dr, dc, s);
}
else {
//此棋盘中无特殊方格,用t号L型骨牌覆盖右上角
Board[tr + s][tr + s -1] = t;
//覆盖其余方格
ChessBoard(tr, tc, tr + s , tc + s - 1, s);
}
//覆盖右下角子棋盘
if(dr >= tr + s && dc >= tc + s) {
//特殊方格在此棋盘中
ChessBoard(tr + s, tc+s, dr, dc, s);
}
else {//此棋盘中无特殊方格,用t号L型骨牌覆盖左上角
Board[tr + s ][tc + s] = t;
//覆盖其余方格
ChessBoard(tr + s, tc + s, tr + s , tc + s, s);
}
}
@SuppressWarnings("static-access")
public static void main(String args[]) {
System.out.println("脚本之家测试结果:");
Board[2][2] = 0;
Chess ch = new Chess();
ch.ChessBoard(0, 0, 2, 2, size);
for(int i = 0; i < size; ++ i) {
for(int j = 0; j < size; j++) {
System.out.print(Board[i][j] + " ");
}
System.out.println();
}
}
static final int size = 4;
static int title = 1;
static int Board[][] = new int[size][size];
}
运行结果:
希望本文所述对大家java程序设计有所帮助。
棋盘覆盖问题 java_Java基于分治算法实现的棋盘覆盖问题示例相关推荐
- 算法高级(40)-基于分治算法完美解决的人类基因组计划
一.人类基因组计划 人类基因组计划(英语:Human Genome Project, HGP)是一项规模宏大,跨国跨学科的科学探索工程.其宗旨在于测定组成人类染色体(指单倍体)中所包含的30亿个碱基对 ...
- 从左上角到右下角 棋盘问题_分治算法之棋盘问题
今天小编没怎么学习,就当放松了吧,明天一定要抓紧时间补回来~ 但是不会少了小伙伴们的算法的. 海风的幻想纯音乐 声明:因为两天同时写同一个算法会显示跟我这两天写的文章重复会不通过, 还要申请.审核好麻 ...
- 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc
分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...
- ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)
[0]README 1)本文旨在介绍算法设计技巧包括 贪婪算法.分治算法.动态规划 以及相关的荔枝等: [1]贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的 ...
- 时间窗口算法用matlab,一种基于动态规划算法的时间窗口相关的参与者选择方法与流程...
本发明涉及一种移动群智感知中时间窗口相关的参与者选择方法,特别地,涉及一种基于动态规划算法的时间窗口相关的参与者选择方法. 背景技术: 在移动群智感知网络中,智能设备中嵌入了麦克风.相机.温度传感器. ...
- 分治算法--棋盘覆盖
问题描述 在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘.在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特 ...
- 分治算法--L型骨牌棋盘覆盖
L型骨牌棋盘覆盖 题目描述 有一个棋盘,要求用给定的四种骨牌进行覆盖.四种骨牌定义如下: 给定的棋盘中有一个格子不存在,即不需要覆盖的格子. 输入 输入有多个用例,第一个为用例个数n,接下来每个用 ...
- 基于贪心算法的马踏棋盘哈密顿回路问题
基于贪心算法的马踏棋盘哈密顿回路问题 Github 链接 问题分析 马踏棋盘其实相当于一个解空间的搜索问题,而遍历到每一个节点并要求最后可以回到起点本质上是一个哈密顿回路问题 目前大部分马踏棋盘的相关 ...
- 分治算法——分金块、求残缺棋盘问题
一.分治算法的介绍 将整个问题分解成若干个小问题后分而治之.如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方便求解的子问题,必要时逐步合并这些子 ...
最新文章
- spring boot 服务 正确关闭方式
- pandas 中的函数—— .reset_index()
- Java链表—— LinkedList
- 轻松Ghost XP系统!
- ASP.NET Core(十)Configuration 配置优先级详解
- go redis 清空所有值_【大厂面试】面试官看了赞不绝口的Redis笔记二
- lucene全文检索的概念
- Google推出免费公共域名解析DNS服务
- windows php redis扩展安装,怎么在Windows下安装PHP的Redis扩展服务
- 【配送路径规划】基于matlab遗传算法求解带时间窗的多配送中心半开放式车辆路径规划问题【含Matlab源码 YC002期】
- 数值分析思考题(钟尔杰版)参考解答——第六章
- LOTO示波器 实测 开环增益频响曲线/电源环路响应稳定性
- 解决“: no such file or directory, scandir ‘..\node_modules\node-sass\vendor“
- 音乐播放器补充1video值:currentTime,duration
- 开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面,但可以用管理器运行程序,怎么解决...
- 又拍云叶靖:基于Docker的云处理服务平台
- Ubuntu系统安装及常用软件设置
- 最受中国人欢迎的10种日本药
- 什么是大数据思维,数据思维划分哪几个维度?
- c语言万年历报错系统,用c语言写万年历应该怎样写?