棋盘覆盖--分治法
来源:互联网 发布:广告过滤软件 编辑:程序博客网 时间:2024/05/24 23:14
问题:
在一个2^k×2^k (k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4^k种,因而有4^k种不同的棋盘,棋盘覆盖问题(chess cover problem)要求用L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
思路:分治法
每次将棋盘分成四等份,特殊方格一定在其中一份里,其余三份中按照图中方法添加一块L型骨牌,因此,四份中都存在特殊方格;按此方法,递归求解即可解除。
代码:
#include<cstdio>const int maxn = 32+2;int Board[maxn][maxn];int tile = 0;void ChessBoard(int tr,int tc,int dr,int dc,int size){if(size <= 1)return ;int s = size/2;int t = ++tile;//覆盖左上角 if(dr<s+tr && dc<s+tc){ChessBoard(tr,tc,dr,dc,s);}else{Board[tr+s-1][tc+s-1] = t;ChessBoard(tr,tc,tr+s-1,tc+s-1,s);}//覆盖右上角 if(dr<s+tr && dc>=s+tc){ ChessBoard(tr,tc+s,dr,dc,s); } else{ Board[tr+s-1][tc+s]=t; ChessBoard(tr,tc+s,tr+s-1,tc+s,s); } //左下角 if(dr>=s+tr && dc<s+tc){ ChessBoard(tr+s,tc,dr,dc,s); } else { Board[tr+s][tc+s-1]=t; ChessBoard(tr+s,tc,tr+s,tc+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); }}int main(){ Board[0][0] = 0; printf("请输入特殊方格最初位置:\n"); int dr,dc; scanf("%d%d",&dr,&dc);ChessBoard(0,0,dr,dc,16);for(int i = 0; i < 16; i++){for(int j = 0; j < 16; j++){printf("%3d",Board[i][j]);}printf("\n");}return 0;}
输出:
阅读全文
0 0
- 分治法,棋盘覆盖
- 分治法:棋盘覆盖
- 棋盘覆盖--分治法
- 分治法-棋盘覆盖问题
- 棋盘覆盖(分治法)
- 分治法:棋盘覆盖问题
- 棋盘覆盖问题 (分治法)
- 分治法之棋盘覆盖
- 棋盘覆盖问题 - 分治法
- 棋盘覆盖问题 分治法
- 分治法---棋盘覆盖问题
- 棋盘覆盖【递归分治法】
- 分治法解决棋盘覆盖
- 分治法实现棋盘覆盖
- 使用分治法解决棋盘覆盖问题
- 利用分治法解决棋盘覆盖问题
- js算法:分治法-棋盘覆盖
- 分治法——棋盘覆盖问题
- windows和虚拟机ubuntu栈地址扩展的不同
- Android-获取view的宽高
- 图文并茂的sklearn PCA教程
- 编译原理中运算符的左结合和右结合
- [深度学习]Contractive Autoencoder
- 棋盘覆盖--分治法
- 真人秀
- 数组操作系列之去除空值与转换汉字
- maven项目配置redis,实现购物车功能
- 2.netty的helloworld
- 动态代理-CGLib动态代理
- 矩阵DP例题
- oracle开机自启配置
- 修改windows控制台的编码格式为utf-8