Java基于分治算法实现的棋盘覆盖问题示例
作者:萌神哆啦A梦 发布时间:2021-07-17 14:05:16
标签: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程序设计有所帮助。
来源:http://blog.csdn.net/u014755255/article/details/50531621


猜你喜欢
- 本文实例为大家分享了java实现文件上传下载的具体代码,供大家参考,具体内容如下1.上传单个文件Controller控制层import ja
- 前言本文主要给大家介绍了关于JDK8新增的原子性操作类LongAdder的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的
- 在官方的这篇文档中为大家介绍了如何使用Java开启Azure Windows虚拟机的诊断设置这篇文章呢,为大家介绍一下如何使用Java开启L
- 先说结论:对于有捕获的lambda,其等价于对象。对于没有任何捕获的lambda,其等价于函数!首先,很多C++程序员从lambda 用法上
- 中午没事,把去年刚毕业那会画的几张图翻出来了,大概介绍Winform应用程序运行的过程,以及TCP协议在Winform中的应用。如果有Win
- 本文实例为大家分享了Android颜色渐变滚动展示的具体代码,供大家参考,具体内容如下public class FlashTextView
- 在项目中,需要使用XStream将xml string转成相应的对象,却报出了java.lang.ClassCastException: c
- 本文代码为原创一个简陋的管理系统,只做功能的测试。并没有去完善所有应有的功能,只做了输入输出查找,仅供参考! 菜单部分: 
- Java的SPI机制实例详解SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或
- 基本要点1、定义根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式2、传统方式与Restful风格的区别在我们学习re
- 最近用到一些字符串加密,而.net中提供的加密算法中用起来比较复杂,便简单的封装了一下,方便日后使用。public class Encryp
- 目录断言对象、数组、集合ObjectUtilsStringUtilsCollectionUtils文件、资源、IO 流FileCopyUti
- 示例代码本文分析示例代码如下:launch(Dispatchers.Main) { flow { em
- 在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 S
- P代表(Profiles配置文件)在<profiles>指定的<id>中,可以通过-P进行传递或者赋值。假如pom.
- 很多app中在第一次安装登陆时会有引导欢迎界面,第二次打开时就不再显示引导页面。这个功能可以通过使用SharePreferences将用户的
- 这一篇文章介绍SpringBoot应用修改默认打jar形式部署为打war包形式,部署到外部Tomcat。SpringBoot应用默认打包成为
- Android Studio在实现隐藏标题栏和状态栏上和Eclipse是完全不一样的。在Eclipse上隐藏标题栏和状态栏的代码如下:方法一
- 本文实例讲述了Android Appwidget用法。分享给大家供大家参考,具体如下:App Widgets 是一个小型应用程序的View&
- 简介Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JV