大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!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