棋盘覆盖问题
来源:互联网 发布:淘宝短信营销作用大吗 编辑:程序博客网 时间:2024/06/03 18:44
什么是棋盘覆盖问题?请看 —> 百度百科 - 棋盘覆盖问题
如何更好地显示算法结果?请看 —> 用QT设计《棋盘覆盖问题》UI部分
CCPalgorithm.hpp
#ifndef _CCP_ALGORITHM_#define _CCP_ALGORITHM_#include <vector>// num为棋盘边长(单位:方格个数),I和J为特殊方格的位置。// 该函数返回一个二维数组,二维数组包含了N+1组数,每组数表示一个L型骨牌。std::vector<std::vector<int>> solve_problem(int num, int I, int J);// 分治法的递归函数void DC(std::vector<std::vector<int>>& result, // 表示棋盘的数组 int tlI, int tlJ, int brI, int brJ, // 当前管理的区域的top left及bottom right的位置 int spcI, int spcJ, // 特殊点的位置 int& n); // L型骨牌的编号#endif
CCPalgorithm.cpp
std::vector<std::vector<int>> solve_problem(int num, int I, int J){ // 创建棋盘 std::vector<std::vector<int>> result(num, std::vector<int>(num, -1)); int n = 0; result[I][J] = n; // 特殊点编号为0 DC(result, 0, 0, result.size() - 1, result[0].size() - 1, I, J, ++n); return result;}void DC(std::vector<std::vector<int>>& result, int tlI, int tlJ, int brI, int brJ, int spcI, int spcJ, int& n){ if (brI - tlI <= 1) // 终止条件,区域为 2 * 2 大小时停止 { /**** 对除特殊点外的三个方格统一编号为一个L型骨牌 ****/ int temp = result[spcI][spcJ]; result[tlI][tlJ] = n; result[tlI + 1][tlJ] = n; result[tlI][tlJ + 1] = n; result[tlI + 1][tlJ + 1] = n; result[spcI][spcJ] = temp; /**** 对除特殊点外的三个方格统一编号为一个L型骨牌 ****/ ++n; return; } int midI = tlI + (brI- tlI) / 2; int midJ = tlJ + (brJ- tlJ) / 2; int tempN = n++; /******************** 处理左上角区域 *******************/ if (midI >= spcI && midJ >= spcJ) // 如果特殊点在该区域 { DC(result, tlI, tlJ, midI, midJ, spcI, spcJ, n); } else { // 如果特殊点不在此区域,把此区域的右下角标记为特殊点递归处理 result[midI][midJ] = tempN; DC(result, tlI, tlJ, midI, midJ, midI, midJ, n); } /****************** 处理左上角区域END ******************/ /******************** 处理右上角区域 *******************/ if (midI >= spcI && midJ < spcJ) { DC(result, tlI, midJ + 1, midI, brJ, spcI, spcJ, n); } else { result[midI][midJ + 1] = tempN; DC(result, tlI, midJ + 1, midI, brJ, midI, midJ + 1, n); } /****************** 处理右上角区域END ******************/ /******************** 处理左下角区域 *******************/ if (midI < spcI && midJ >= spcJ) { DC(result, midI + 1, tlJ, brI, midJ, spcI, spcJ, n); } else { result[midI + 1][midJ] = tempN; DC(result, midI + 1, tlJ, brI, midJ, midI + 1, midJ, n); } /****************** 处理左下角区域END ******************/ /******************** 处理右下角区域 *******************/ if (midI < spcI && midJ < spcJ) { DC(result, midI + 1, midJ + 1, brI, brJ, spcI, spcJ, n); } else { result[midI + 1][midJ + 1] = tempN; DC(result, midI + 1, midJ + 1, brI, brJ, midI + 1, midJ + 1, n); } /******************* 处理右下角区域END *****************/}
0 0
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- ChessBoard棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 《ChessboardCoverage_棋盘覆盖问题》
- 棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘覆盖问题
- 指数(道琼斯指数)
- 分治---快速排序
- python学习笔记(4):字符串及编码问题
- scaleType的详细解释
- 正则表达式元字符
- 棋盘覆盖问题
- CSS基础知识深入探讨
- 解决 react-native run-android 出现 gradle下载慢问题
- 【应用】使用STM32单片机定时器的Encoder模式驱动数字旋转编码开关
- c语言的大数相乘 十分经典的代码
- RGCDQ(筛法)
- php 访问mysql
- 【从0到1学习Java线程池】一个Java线程池的简单实现
- 组合逻辑——竞争和冒险