方格分割

该博客探讨了一道关于6x6方格沿着边线分割成形状相同的两部分的问题。作者首先尝试了枚举方法,但发现难以实现。随后,采用从(3,3)位置开始,通过深度优先搜索(DFS)寻找边线来确定分割方法。提供的C++代码实现了这一算法,得出共有509种不同的分割方式,注意旋转对称的情况被视为同一种。博客重点在于DFS算法的应用和问题解决策略。
摘要由CSDN通过智能技术生成

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

思路:本来我的思路是枚举每个方格,从第一列枚举到第六列,方格加起来数为18个并且中心对称,后来发现此方法难以实现。

看了网上博主的解题方法,是从(3,3)开始割,找的是边,一条边就代表了一种分割方法。

再利用dfs具体代码如下:

#include<iostream>
using namespace std;
int N;
int book[7][7];
void dfs(int x, int y)
{
	if (x == 0 || x == 6 || y == 0||y == 6)
	{
		N++;
		return;
	}
	int next[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };			//上下左右
	for (int k = 0; k < 4; k++)
	{
		int tx = x + next[k][0];
		int ty = y + next[k][1];
		if (book[tx][ty] == 0 || book[6 - tx][6 - ty] == 0)
		{
			book[tx][ty] = 1;
			book[6 - tx][6 - ty] = 1;
			dfs(tx, ty);
			book[tx][ty] = 0;
			book[6 - tx][6 - ty] = 0;
		}
	}
}
int main()
{
	book[3][3] = 1;
	dfs(3, 3);
	cout << N / 4 << endl;
	return 0;
}

答案:509

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值