蓝桥杯2017初赛 方格分割 DFS

本文详细解析了蓝桥杯2017初赛方格分割题目的解题思路及算法实现。通过一笔画原理和对称性分析,采用深度优先搜索算法计算出所有可能的分割方案数量。

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

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


蓝桥杯2017初赛 方格分割 😁

题目描述

6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。
在这里插入图片描述

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

输出

输出一个整数表示答案

分析

切割线肯定是一个一笔画啊(一刀两块),而且每一种切割线都会经过中间的那个点((3,3)和(4,4)肯定不在同一个块儿里面啊~~~所以切割线肯定会经过他们相邻的那个点),切割线应该从中点开始搜索,而且只要搜索到边线(就是已经把方块分成两部分了,对称)就可以结束,从中点开始搜第一步有四个方向,而且任意一个方向反转一下都可以得到另一个方向的所有情况,所以使用边线搜索的结果最后应该除以/4

/*
 * @Author: motongxue
 * @Date: 2020-09-26 22:44:26
 * @LastEditors: motongxue
 * @LastEditTime: 2020-09-26 22:46:09
 * @Blog: https://motongxue.cn
 * @Description: file content
 */
public class Main {
    static int ans = 0;
    static int[][] move = { { -1, 1, 0, 0 }, { 0, 0, -1, 1 } };
    static boolean[][] vis = new boolean[7][7];

    static 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 curx = x + move[0][i];
            int cury = y + move[1][i];
            if (!vis[curx][cury] && !vis[6 - curx][6 - cury]) {
                vis[curx][cury] = true;
                vis[6 - curx][6 - cury] = true;// 对称点
                dfs(curx, cury);
                vis[curx][cury] = false;
                vis[6 - curx][6 - cury] = false;
            }
        }
    }

    public static void main(String[] args) {
        vis[3][3] = true;
        dfs(3, 3);
        System.out.println(ans / 4);
    }
}


2020年9月26日更

大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值