欢迎光临散文网 会员登陆 & 注册

蓝桥杯学习——方格分割

2022-03-21 20:54 作者:长舟泛歌  | 我要投稿

一、解题思路

 题目为如图1所示的6×6网格,需要将其分为完全相同的两部分。开始我想到从某个角开始分割,尝试无果后,得知可以用深搜。将网格线从上到下,从左到右标号为0~6。从(3,3)点观察发现,两边区域呈中心对称,故可以通过深搜一边得到两边都分割好的结果。由于中心对称且搜索时向上向下向左向右都会进行搜索,有一些结果会重合,比如一直向上搜索和一直向下搜索,所以最终结果要除以4。

图一  题目方格

二、深搜思路

本题不同于数据结构中学过的简单深度搜索遍历,课中利用邻接矩阵或者邻接表实现搜索,这里用坐标加一减一来实现遍历,通过visit数组来确认是否走过这一格点(需要注意,在每次深搜的末尾,需要将visit数组置零,因为从一个格点走向另一个格点有不同的走法(详情可看图二),如果不清零搜索回到前置格点后,则无法记录另一种走法得到的遍历结果)。

图二

了解这些后开始写搜索代码我们在每次搜索时都会进行向上、向下,向左和向右的递归搜索并且将此时搜索到的点的visit数组置一,代表已经走过了(但并不是不会再走了,而是指在本次搜索路径中,这个格点已经走过了)并且在向四个方向都搜索过之后将visit数组置零(意思是回到之前的格点,这个格点又可以走了)。代码如下

递归肯定有返回,我们在所有方向都搜索了一遍后返回,还有一个返回点时在深搜函数开头:如果搜索到了边界,那么就代表分割完成了,也要返回。代码如下

三、main函数

主要是要想到深度搜索,main函数中倒是很简单。由于visit是二维数组,所以要手动初始化,这里采用了最基础的方法双重for循环。然后在深搜之后,就可以输出答案啦。

四、完整代码

五、遇到的问题

开始的时候将visit数组置一写到了边界返回的前面,这样导致边界点visit置一后没有置零直接返回了,下一次搜索就不会再次进行到这个边界点了

六、参考资料

https://blog.csdn.net/shmily_ke/article/details/122567442


第一次写,有什么问题请尽管且一定提,谢谢大家!!!!

蓝桥杯学习——方格分割的评论 (共 条)

分享到微博请遵守国家法律