递归求解棋盘覆盖问题

该实验旨在通过递归和分治策略解决棋盘覆盖问题,使用L型骨牌覆盖特殊棋盘。实验涉及C++编程,采用CodeBlocks平台,展示了针对不同大小棋盘(如8x8和16x16)的解决方案,强调递归在简化编程和提高代码可读性中的作用。
摘要由CSDN通过智能技术生成

一、实验目的

1.掌握基于递归方法求解分治问题的基本原理。

2.掌握棋盘覆盖问题递归函数的设计方法。

3.掌握基于递归分治方法求解棋盘覆盖问题的具体步骤。

4.具备运用递归分治方法设计算法并解决其他实际应用问题的能力

5. 通过对棋盘覆盖问题的求解,加深对递归和分治思想的理解

二、实验环境

操作系统:Windows10

实验平台:CodeBlocks

编译器:Gcc

实验语言:C++

三、实验内容

用4种不同的L型骨牌覆盖一个给定的特殊棋盘上除去特殊方格外的所有方格,且任何两个L型骨牌不得重复覆盖(在一个2^k*2^k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,在程序实现中,用字符0表示特殊方格),如图所示,红色为特殊方格,其次为覆盖所用到的4种不同的L型骨牌。

四、算法描述

分析可知:在2^k*2^k的棋盘覆盖中,用到的L型骨盘数为(4^k-1)/3个,即(所有方格个数-特殊方格个数)/3 ,特殊方格出现的位置有4^k种情况,即k>=0,有4^k种不同的特殊棋盘将2k x 2k的棋盘划分为2(k-1) x 2(k-1)这样的子棋盘4块。

递归填充各个棋子,填充分为四种情况

  1. 如果特殊方格在左上子棋盘,则递归填充左上子棋盘;否则填充左上子棋盘的右下角,将右下角看作特殊方格,然后递归填充左上棋盘。

  1. 如果特殊方格在右上子棋盘,则递归填充右上子棋盘;否则填充右上子棋盘的左下角,将左下角看作特殊方格,然后递归填充右上棋盘。

  1. 如果特殊方格在左下子棋盘,则递归填充左下子棋盘;否则填充左下子棋盘的右上角,将右上角看作特殊方格,然后递归填充左下棋盘。

  1. 如果特殊方格在右下子棋盘,则递归填充右下子棋盘;否则填充右下子棋盘的左上角,将左上角看作特殊方格,然后递归填充右下棋盘。

时间复杂度分析:

五、实验结果

输入K=3,即棋盘大小为8*8格,设置特殊方格坐标为(0,1),即棋盘第一行第二个位置,程序运行结果显示可以覆盖(L型骨牌分别用‘!’,‘#’,‘*’的组合进行标识)

输入K=4,即棋盘大小为16*16格,设置特殊方格坐标为(0,1),即棋盘第一行第二个位置,程序运行结果显示可以覆盖(L型骨牌分别用‘!’,‘#’,‘*’的组合进行标识)

六、实验总结

通过棋盘覆盖试验,理解了递归与分治策略算法的思想和递归程序的执行过程,深刻了解到递归对于简化程序编写的重要作用,了解到递归可以使代码更加清晰,可读性更好,减轻了程序编写者的负担。通过实验,增强了编写递归程序和分治算法的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值