棋盘覆盖问题算法分析,棋盘覆盖问题算法思路
主要介绍基于分治算法的ava实现的棋盘覆盖问题,简述棋盘覆盖问题,结合具体实例分析基于分治算法的java相关操作技巧。有需要的可以参考一下。
分治算法是一种使用分治思想的算法。在了解棋盘问题之前,我们先来了解一下什么是各个击破。
父问题分解成子问题,用同样的方法求解,这和递归的概念是一致的。所以分治算法通常采用递归实现(当然也有非递归实现)。分治算法的描述从字面上也很好理解。分治算法之间实际上有一个合并的过程:
划分:递归解决较小的问题(停在末级或者可以解决的时候)征服:递归解决,问题足够小就直接解决。合并:建立子问题的解决方案。一般父问题的分治算法在文本中分解成两个或两个以上的递归调用,子类问题一般不想交叉(互不影响)。当解决一个规模较大的问题难以直接解决,而规模较小时,问题容易解决且问题满足分治算法的适用条件时,则可以使用分治算法。
在由2^k * 2^k方格组成的棋盘中,一个方格与其他方格不同。如果用下面四张L型多米诺骨牌盖住除了这个特殊的方块以外的其他方块,如何盖住?四张L形多米诺骨牌如下:
棋盘中的特殊方格如图所示:
实现的基本原理是将一个2^k * 2k棋盘分成4个2 (2(k-1) * 2^(k-1)子棋盘,特殊方格必须在其中一个子棋盘中。如果特殊方格在某个子棋盘中,继续递归处理该子棋盘,直到子棋盘中只剩下一个方格。如果特殊方格不在某个子棋盘中,则将子棋盘中相应的位置设置为多米诺骨牌号码。上述原理如图所示:
具体代码如下:
包演示;
公共级国际象棋{
/*tr表示棋盘左上角的线数。
Tc表示棋盘左上角的列号。
Dr表示特殊棋盘的行号。
Dc表示特定棋盘的列号*/
公共静态空棋盘(int tr,int tc,int dr,int dc,int size){
if(size==1) {
返回;
}
int t=title
int s=size/2;
//覆盖左上棋盘
if(dr tr s dc tc s) {
//特殊的方块在这个棋盘里
棋盘(tr,tc,dr,dc,s);
}
否则{
//这个棋盘没有特别的方格。用T型L型多米诺骨牌盖住右下角。
board[tr s-1][tr s-1]=t;
//覆盖剩余的方块
棋盘(tr,tc,tr s - 1,tc s - 1,s);
}
//覆盖右上棋盘
if(dr tr s dc=tc s) {
//特殊的方块在这个棋盘里
棋盘(tr,tc s,dr,dc,s);
}
Else {//这个板子中午有一个特别的方块,用T型L型多米诺骨牌盖住左下角。
board[tr s-1][TC s]=t;
//覆盖剩余的方块
棋盘(tr,tc s,tr s - 1,tc s,s);
}
//覆盖左下棋盘
if(dr=tr s dc tc s) {
//特殊的方块在这个棋盘里
棋盘(tr s,tc,dr,dc,s);
}
否则{
//这个棋盘没有特别的方格。用T型L型多米诺骨牌盖住右上角。
board[tr s][tr s-1]=t;
//覆盖剩余的方块
棋盘(tr,tc,tr s,tc s - 1,s);
}
//覆盖右下角的子棋盘
if(dr=tr s dc=tc s) {
//特殊的方块在这个棋盘里
棋盘(tr s,tc s,dr,dc,s);
}
Else {//这个棋盘没有特别的方格。用T型L型多米诺骨牌盖住左上角。
board[tr s][TC s]=t;
//覆盖剩余的方块
棋盘(tr s,tc s,tr s,tc s,s);
}
}
@SuppressWarnings(静态访问)
公共静态void main(String args[]){
System.out.println(测试结果:);
board[2][2]=0;
Chess ch=new Chess();
栗色棋盘(0,0,2,2,大小);
for(int I=0;I尺寸;i) {
for(int j=0;j尺寸;j ) {
system . out . print(Board[I][j] );
}
system . out . println();
}
}
静态最终int size=4;
静态int title=1;
静态int Board[][]=new int[size][size];
}运行结果:
版权归作者所有:原创作品来自博主、程序员,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。