分治法实现棋盘覆盖C++
2017-06-05 20:59
676 查看
#include<iostream> using namespace std; const int size = 8; static int tile = 1; static int board[size][size] = { 0 }; class CHESSBOARD { public: /* 分治法实现棋盘覆盖 */ static void chessBoard(int tr, int tc, int dr, int dc, int size) { //若棋盘大小小于1,则返回 if (1 == size) { return; } //L型骨牌 int t = tile++; //分割棋盘 int s = size / 2; //覆盖左上角子棋盘 if (dr < tr + s&&dc < tc + s) { //特殊方格再此棋盘中 chessBoard(tr, tc, dr, dc, s); } else { //此棋盘无特殊方格,用t号L型骨牌覆盖右下角 board[tr + s - 1][tc + 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 { //否则,L型骨牌覆盖 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 { //L型骨牌覆盖 board[tr + s][tc + s] = t; //递归遍历剩余棋盘空间 chessBoard(tr + s, tc + s, tr + s, tc + s, s); } } //输出棋盘覆盖结果 static void output() { for (int i = 0; i<size; ++i) { for (int j = 0; j<size; ++j) { cout << board[i][j] << "\t"; } cout << "\n"; } } }; int main() { CHESSBOARD::chessBoard(0, 0, 3, 4, size); CHESSBOARD::output(); return 0; }
相关文章推荐
- 算法java实现--分治法--棋盘覆盖问题
- 分治法实现棋盘覆盖
- 棋盘覆盖问题 C++实现11
- 棋盘覆盖问题 - 分治法(c++)
- 棋盘的完美覆盖问题,c++代码实现
- 棋盘的完美覆盖问题,c++代码实现
- 棋盘的完美覆盖问题,c++代码实现
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- 分治法--用C++实现合并排序
- 棋盘覆盖问题C++代码
- 棋盘类实现文件C++
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- 棋盘覆盖问题的算法实现
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 算法设计与分析--求最大子段和问题(蛮力法、分治法、动态规划法) C++实现
- C++多态实现(虚函数,成员函数覆盖、隐藏)
- 分治算法之 棋盘覆盖问题(完整代码实现)
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- 棋盘覆盖问题的算法实现
- 棋盘覆盖--递归分治java实现