[蓝桥杯][2017年第八届真题]方格分割

该博客探讨了一种6x6方格沿着边线分割成两个中心对称部分的数学问题。通过从中心点出发进行深度优先搜索(DFS),并考虑边线交点作为搜索单位,确保剪切线呈中心对称。注意到由于四个方向的剪切可能导致重复计数,因此最终解决方案需要除以4。提供的C++代码实现了这一逻辑,并输出了不同分割方法的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

如图:p1.png, p2.png, p3.png 就是可行的分割法。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。

请输出该整数,不要填写任何多余的内容或说明文字。
输入

无输入
输出

一个整数
提示

用printf或cout输出答案

思路:

看到这道题,第一反应是从6X6的方格里使用DFS选18个格子,并在选的过程中保证中心对称,但是细想一下,因为DFS要选择起点,但是起点有6X6个点,而且对于一种方案,某些起点会包含在里面,求出的结果显然不能单纯的除以一个常数来得到最终的答案。所以得另寻思路。

题干中说沿着边线剪开,所以除了直接找格子外,还可以找边线,把边线的交点看作dfs的单位。要使剪出来的两部分中心对称,只需要使剪的边线呈中心对称,所以需要从(3,3)开始剪,只需要剪到边界即可,然后再从中心点按中心对称的原则剪出另一条线,最后就得到两个呈中心对称的部分。

注意:搜索到边界的路线时,可能朝四个方向剪,所以相同的剪法会重复计算四次。因此最后求出的方法数/4就是最终答案

 

代码:

#include<bits/stdc++.h>
using namespace std;
int mp[10][10];
int vis[10][10];
int dx[]= {-1,1,0,0};
int dy[]= {0,0,1,-1};
int ans;
int n=6;
void dfs(int x,int y)
{
    if(x==0||x==n||y==0||y==n)
    {
        ans++;
        return ;
    }
    for(int i = 0; i<4; i++)
    {
        int tx = x+dx[i];
        int ty = y+dy[i];
        if(!vis[tx][ty])
        {
            vis[tx][ty]=1;
            vis[n-tx][n-ty]=1;
            dfs(tx,ty);
            vis[tx][ty]=0;
            vis[n-tx][n-ty]=0;
        }
    }
}
int main()
{
    vis[n/2][n/2]=1;
    dfs(n/2,n/2);
    cout<<ans/4<<endl;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值