方格分割(蓝桥杯C/C++省赛)

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。

如下就是三种可行的分割法。

正在上传…重新上传取消

试计算: 包括这 33 种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

这道题第一眼真看不出来是个搜索题,我们不妨这样分析,不去看格子,而是看格子的线,是一个7*7的线,如果要形成对称,就一定要经过中心点(3,3) ,并且经过(x,y)时就一定要经过(6-x,6-y)这样才能对称,最后再除以4就是最终答案

#include <bits/stdc++.h>
using namespace std;
bool vis[7][7];
int X[4]={0,0,1,-1};
int Y[4]={1,-1,0,0};
int ans; 
void dfs(int x,int y)
{
	if(x==0||x==6||y==0||y==6)
	{
		ans++;
		return;
	}
	for(int i=0;i<4;i++)
	{
		int nx=x+X[i];
		int ny=y+Y[i];
		if(!vis[nx][ny])
		{
			vis[nx][ny]=true;
			vis[6-nx][6-ny]=true;
			dfs(nx,ny);
			vis[nx][ny]=false;
			vis[6-nx][6-ny]=false;
		}
	}
}
int main()
{
	vis[3][3]=true;//别忘了初始条件 
	dfs(3,3);
	cout<<ans/4;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_71934846/article/details/129349801
今日推荐