方格分裂-蓝桥杯真题 DFS深度搜索(c++实现)

上文链接:蓝桥杯真题之购物单(一分钟巧解)


方格分割

6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如下三图就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我的思路

  • 方格解析:该方格是7行7列的方格,红橙两连通方格围绕(3,3)对称。图示如下。
    在这里插入图片描述
  • 思路:求解对称的方式有多少种,可以利用DFS(深度遍历)+递归思想,从中心对称点开始走,一次走到结尾。过程为:先标注当前点及对称点,然后沿着当前点向四个方向走,走前判断下步是否合法且是否已经走过,若合法,走到下步继续重复此过程(递归实现)。直到走到边界。注意点如下。
  1. 从该点走完整个路径时回溯该点未走过的状态,为下次再走做准备。
  2. 因为从对称中心(3,3)向四个方向均可以走,如果开始沿着四个方向,比如向前一直走和向后一直走和向上一直带走,向下一直走路径相同,那么最后结果旋转之后呈现的对称方式相同。所以最后得到的结果应该除以4。

算法展示

#include <iostream>
using namespace std;
typedef int It;//为方便大范围时修改进行类型定义 

It tag[7][7];//标注被访问的点
It dire[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//定义行走方向,上下左右 
It ans=0;//记录结果,因为(x,y)向四个方向走并标注对称方格,旋转之后沿四个方向走相同步骤其实是同一种对称方式,所以结果应该除以4 
It lenDire = sizeof(dire)/sizeof(dire[0]);//获取方向长度 
 
void dfs(It x,It y)//深度遍历 
{
	if(x==0||y==0||x==6||y==6)//走到边界,表示可以构成对称方格,记录该方式。 
	{
		ans++;
		return; 
	}
	//标注走过点 
	tag[x][y]=1;
	tag[6-x][6-y]=1;
	//改变方向行走
	for(int i =0;i<lenDire;i++)
	{
		int curX = x+dire[i][0];
		int curY = y+dire[i][1];
		//判断当前走向是否合法且未走过
		if(tag[curX][curY]==1||(curX<0||curY<0||curX>6||curY>6))continue; 
		
		dfs(curX,curY);
	} 
	//查找完成后回溯标注点
	tag[x][y]=0;
	tag[6-x][6-y]=0;
}
 
int main()
{
	dfs(3,3); 
	cout<<ans/4<<endl;
	return 0;
}

下文链接:最大公共子串-蓝桥杯真题 动态规划(c++实现)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河南-殷志强

希望我的文章能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值