0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中棋盘覆盖问题分析

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-10-08 17:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

棋盘覆盖问题

问题说明

在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格。

棋盘覆盖问题就是要用图示的4种不同形态的L型骨牌覆盖给定棋盘上除特殊方格之外的所有方格,且任何2个L型骨牌不得重叠覆盖。

功能说明

本程序用分治法的思想解决了棋盘覆盖问题,显示输出

代码简述

用户输入数据,程序输入检测,动态分配空间,调用棋盘覆盖函数,把计算结果存储到board(二维数组指针),显示输出。

其中棋盘覆盖函数用分治的思想把棋盘分成四份,递归求解。

源码示例:

#include《iostream》#include《math.h》#include《cctype》usingnamespacestd;intnum_Now =0;//记录L型骨牌编号int**board =NULL;//棋盘指针//函数声明

voidChessBoard(intnum_BoardTopLeftRow,intnum_BoardTopLeftColumn,intnum_SpecialRow,intnum_SpecialColumn,intboardSize);intmain() {intnum_BoardTopLeftRow =0,//棋盘左上角的行号

num_BoardTopLeftColumn =0,//棋盘左上角的列号num_SpecialRow =0,//特殊方格所在的行号num_SpecialColumn =0,//特殊方格所在的列号boardSize =0,//棋盘大小k =0;//构成的(2^k)*(2^k)个方格的棋盘

//用户界面cout 《《“---------------- 棋盘覆盖问题 ----------------”《《 endl;cout 《《“请输入k(k》=0),构成(2^k)*(2^k)个方格的棋盘”《《 endl;//输入k值cin 》》 k;//判断输入数据合法性,包括检查输入是否为数字,k值是否大于0if(cin.fail() || k 《0){cout 《《“输入k错误!”《《 endl;system(“pause”);

return0;}//计算棋盘大小

boardSize =pow(2, k);cout 《《“请输入特殊方格所在的行号和列号(从0开始,用空格隔开)”《《 endl;//输入特殊方格所在的行号和列号cin 》》 num_SpecialRow 》》 num_SpecialColumn;//判断输入数据合法性,包括检查输入是否为数字,特殊方格行号列号是否大于0,特殊方格行号列号是否不大于棋盘大小

if(cin.fail() || num_SpecialRow 《0|| num_SpecialColumn 《0|| num_SpecialRow 》= boardSize || num_SpecialColumn 》= boardSize){cout 《《“输入行号或列号错误!”《《 endl;system(“pause”);return0;}//分配棋盘空间

board =newint*[boardSize];for(autoi =0; i 《 boardSize; i++){board[i] =newint[boardSize];}//为特殊方格赋初值

0board[num_SpecialRow][num_SpecialColumn] =0;//执行棋盘覆盖函数

ChessBoard(num_BoardTopLeftRow, num_BoardTopLeftColumn, num_SpecialRow, num_SpecialColumn, boardSize);//显示输出

cout 《《“------------------------------------------------”《《 endl;for(autoi =0; i 《 boardSize; i++){for(autoj =0; j 《 boardSize; j++){cout 《《 board[i][j] 《《“ ”;}cout 《《 endl;}cout 《《“------------------------------------------------”《《 endl;//暂停查看结果

system(“pause”);//释放内存for(inti =0; i 《= boardSize; i++)delete[]board[i];delete[]board;//指针置空board =NULL;return0;}//棋盘覆盖函数

voidChessBoard(intnum_BoardTopLeftRow,intnum_BoardTopLeftColumn,intnum_SpecialRow,intnum_SpecialColumn,intboardSize){//棋盘大小为1则直接返回if(boardSize ==1)return;intnum = ++num_Now,//L型骨牌编号

size = boardSize /2;//分割棋盘,行列各一分为二//覆盖左上角子棋盘

if(num_SpecialRow 《 num_BoardTopLeftRow + size && num_SpecialColumn 《 num_BoardTopLeftColumn + size){//递归覆盖含有特殊方格的子棋盘

ChessBoard(num_BoardTopLeftRow, num_BoardTopLeftColumn, num_SpecialRow, num_SpecialColumn, size);}else{//用编号为num的L型骨牌覆盖右下角

board[num_BoardTopLeftRow + size -1][num_BoardTopLeftColumn + size -1] = num;//递归覆盖其余棋盘

ChessBoard(num_BoardTopLeftRow, num_BoardTopLeftColumn, num_BoardTopLeftRow + size -1, num_BoardTopLeftColumn + size -1, size);}//覆盖右上角子棋盘

if(num_SpecialRow 《 num_BoardTopLeftRow + size && num_SpecialColumn 》= num_BoardTopLeftColumn + size){//递归覆盖含有特殊方格的子棋盘ChessBoard(num_BoardTopLeftRow, num_BoardTopLeftColumn + size, num_SpecialRow, num_SpecialColumn, size);}else{//用编号为num的L型骨牌覆盖左下角

board[num_BoardTopLeftRow + size -1][num_BoardTopLeftColumn + size] = num;//递归覆盖其余棋盘ChessBoard(num_BoardTopLeftRow, num_BoardTopLeftColumn + size, num_BoardTopLeftRow + size -1, num_BoardTopLeftColumn + size, size);}//覆盖左下角子棋盘

if(num_SpecialRow 》= num_BoardTopLeftRow + size && num_SpecialColumn 《 num_BoardTopLeftColumn + size){//递归覆盖含有特殊方格的子棋盘ChessBoard(num_BoardTopLeftRow + size, num_BoardTopLeftColumn, num_SpecialRow, num_SpecialColumn, size);}else{//用编号为num的L型骨牌覆盖右上角

board[num_BoardTopLeftRow + size][num_BoardTopLeftColumn + size -1] = num;//递归覆盖其余棋盘

ChessBoard(num_BoardTopLeftRow + size, num_BoardTopLeftColumn, num_BoardTopLeftRow + size, num_BoardTopLeftColumn + size -1, size);}//覆盖右下角子棋盘

if(num_SpecialRow 》= num_BoardTopLeftRow + size && num_SpecialColumn 》= num_BoardTopLeftColumn + size){//递归覆盖含有特殊方格的子棋盘

ChessBoard(num_BoardTopLeftRow + size, num_BoardTopLeftColumn + size, num_SpecialRow, num_SpecialColumn, size);}else{//用编号为num的L型骨牌覆盖左上角

board[num_BoardTopLeftRow + size][num_BoardTopLeftColumn + size] = num;//递归覆盖其余棋盘

ChessBoard(num_BoardTopLeftRow + size, num_BoardTopLeftColumn + size, num_BoardTopLeftRow + size, num_BoardTopLeftColumn + size, size);}}

今天的分享就到这里了,大家要好好学C++哟~

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146169
  • C++
    C++
    +关注

    关注

    22

    文章

    2131

    浏览量

    77378

原文标题:C++经典算法问题:棋盘覆盖问题(分治算法)!含源码示例

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用VectorCAST/C++的AI辅助测试功能

    从2026版本开始,VectorCAST/C++推出首批AI辅助测试功能,旨在帮助开发团队解决单元测试过程的两个核心难点:
    的头像 发表于 04-27 14:37 155次阅读

    C++与lua联合编程

    在现代软件工程的庞大架构,纯粹的 C++ 与动态脚本语言之间的关系,早已演变成一场精密的“商业分工”。C++ 扮演着提供极致性能的“底层重工业”,而 Lua 则充当着实现灵活业务逻辑的“轻量级
    发表于 04-19 16:27

    C++:const 的空间,常量也能占内存?

    5g.5jh.dg8sg.cnJIWWQc++语言 c++语言5g.Zq2.dg8sg.cnJIWWQc++语言 def lock_tetromino(self): \"\"\"将落地的方块锁定到网格
    发表于 04-16 19:19

    keil实现cc++混合编程

    起因项目中使用到一个开源的模拟IIC的库,封装的比较好,但是是使用c++写的。于是将其移植到自己的项目中,主要有以下三步操作: 在工程选项 C/C++中去掉勾选
    发表于 01-26 08:58

    C语言与C++的区别及联系

    是面向过程语言,而C++是面向对象语言。说CC++的区别,也就是在比较面向过程和面向对象的区别。 1、面向过程和面向对象的区别 面向过程:面向过程编程就是分析出解决问题的步骤,然
    发表于 12-24 07:23

    CC++之间的联系

    1、语法兼容性: C++完全兼容C语言的语法,这意味着任何有效的C语言程序都可以直接在C++编译器下编译通过。 2、底层控制: C++
    发表于 12-11 06:51

    C语言和C++之间的区别是什么

    区别 1、面向对象编程 (OOP): C语言是一种面向过程的语言,它强调的是通过函数将任务分解为一系列步骤进行执行。 C++C语言的基础上扩展了面向对象的特性,支持类(class)、封装、继承
    发表于 12-11 06:23

    C/C++条件编译

    条件编译是一种在编译时根据条件选择性地包含或排除部分代码的处理方法。在 C/C++ ,条件编译使用预处理指令 #ifdef、#endif、#else 和 #elif 来实现。常用的条件编译指令有
    发表于 12-05 06:21

    C++程序异常的处理机制

    1、什么是异常处理? 有经验的朋友应该知道,在正常的CC++编程过程难免会碰到程序不按照原本设计运行的情况。 最常见的有除法分母为零,数组越界,内存分配失效、打开相应文件失败等等。 一个程序
    发表于 12-02 07:12

    C/C++代码静态测试工具Perforce QAC 2025.3的新特性

     Perforce Validate  QAC 项目的相对/根路径的支持。C++ 分析也得到了增强,增加了用于检测 C++ 并发问题的新检查,并改进了实体名称和实
    的头像 发表于 10-13 18:11 736次阅读
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代码静态测试工具Perforce QAC 2025.3的新特性

    技能+1!如何在树莓派上使用C++控制GPIO?

    和PiGPIO等库,C++可用于编程控制树莓派的GPIO引脚。它提供了更好的性能和控制能力,非常适合对速度和精度要求较高的硬件项目。在树莓派社区,关于“Python
    的头像 发表于 08-06 15:33 4503次阅读
    技能+1!如何在树莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    Perforce QAC产品简介:面向C/C++的静态代码分析工具(已通过SO 26262认证)

    Perforce QAC专为C/C++开发者打造,支持多种编码规范、功能安全标准(ISO 26262)等,广泛用于汽车、医疗、嵌入式开发领域,可帮助快速识别关键缺陷、提升代码质量、实现合规交付。
    的头像 发表于 07-10 15:57 1464次阅读
    Perforce QAC产品简介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的静态代码<b class='flag-5'>分析</b>工具(已通过SO 26262认证)

    请问如何在C++中使用NPU上的模型缓存?

    无法确定如何在 C++ 的 NPU 上使用模型缓存
    发表于 06-24 07:25

    在OpenVINO™ C++代码启用 AddressSanitizer 时的内存泄漏怎么解决?

    在 OpenVINO™ C++代码启用 AddressSanitizer 时遇到内存泄漏: \"#0 0xaaaab8558370 in operator new(unsigned
    发表于 06-23 07:16

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说内存这道坎儿。您当stm32f4的256kRAM
    的头像 发表于 05-21 10:33 1212次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?