棋盘问题
来源:互联网 发布:gprs数据采集器 编辑:程序博客网 时间:2024/05/09 14:45
用分治策略,设计出解棋盘覆盖问题的方法。
在一个2k *2k的矩阵中,可以分割为4个2k-1 *2k-1子棋盘,如(a)所示,特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。
算法如下:
package cn.aaa;
import java.util.Scanner;
public class ChessBoard {
static int tiel=1;
static int size=4;
static int board[][] = new int[size][size];
public static void ChessBoard(int tr,int tc,int dr,int dc,int size) { //tr为棋盘左上角方格的行数,tc为棋盘左上角方格的列数,
//dr为特殊方格的所在的行号,dc为特殊方格所在的列号,size为棋盘的规格
if(size==1) return;
int t = tiel++; //L型骨牌的个数
int s = size/2; //分割棋盘
//覆盖左上角子棋盘
if(dr<tr+s && dc<tc+s){
ChessBoard(tr,tc,dr,dc,s); //特殊方格在此棋盘中
}else{ //此棋盘中无特殊方格
board[tr+s-1][tc+s-1]=t; //用t号L型骨牌覆盖右下角
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{ //此棋盘中无特殊方格
board[tr+s-1][tc+s]=t; //用t号L型骨牌覆盖右下角
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{ //此棋盘中无特殊方格
board[tr+s][tc+s-1]=t; //用t号L型骨牌覆盖右下角
ChessBoard(tr+s,tc,tr+s,tr+s-1,s); //覆盖其余方格
}
//覆盖右下角子棋盘
if(dr>=tr+s && dc>=tc+s){
ChessBoard(tr+s,tc+s,dr,dc,s);
}else{
board[tr+s][tc+s]=t;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
public static void main(String[] args) {
ChessBoard(0,0,0,0,size); //特殊方格在左上角
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}
}
结果显示:
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- 棋盘问题
- C语言实现由PID获取进程名&由进程名获取PID
- 构建 Docker registry 私有镜像,解决docker私有仓库push出错问题
- Xcode的每个版本发布时间
- 单链队列的基本操作实现
- [BZOJ1984]月下“毛景树”(树链剖分)
- 棋盘问题
- Android SQLite如何判断表是否存在
- 阿里云服务器映射到本地磁盘
- C语言-位运算
- The hunt(狩猎)影评
- 【9-3】迭代dict的value
- 2013 带分数
- html不可不知的15条编码原则
- TensorFlow 简明教程(python版)