标题:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
![p1](https://img-blog.csdnimg.cn/20190316100855654.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5wZWl4aW5nMzYx,size_16,color_FFFFFF,t_70)
![p2](https://img-blog.csdnimg.cn/20190316101135561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5wZWl4aW5nMzYx,size_16,color_FFFFFF,t_70)
![p2](https://img-blog.csdnimg.cn/20190316101209762.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5wZWl4aW5nMzYx,size_16,color_FFFFFF,t_70)
题目思路:
这道题确实看上去有点棘手,基本是用深搜的解法,但是深搜需要遍历的起点以及终点,这道题确实一开始看上去很懵,但是我们仔细看一下会发现,沿着中心点开始剪开,剪到边界两边的剪痕痕迹相同,所以我们建一个二维数组,把中心点作为起点,两个人走着完全对称的路径,若都能走到边界则总方案数加1,由于是中心对称图形,所以最终得到的结果除以4即可。那么这道题便迎刃而解了。
参考代码如下:
public class SquarePartition {
//vis表示该点是否未遍历
static int[][] vis;
//代表上下左右四个方向
static int[][] dir = {{-1,0},{1,0},{0,-1},{0,1}};
//方案数
static int ans = 0;
//深搜函数,以(3,3)点为遍历的起点,两边同时走,走到边界则结束
static void dfs(int x,int y) {
//走到边界则代表结束,方案数自加1
if(x == 0 || y == 0 || x == 6 || y == 6) {
ans++;
return ;
}
for(int i=0; i<4; i++) {
int dx = x + dir[i][0];
int dy = y + dir[i][1];
//该点已经被遍历,则终止遍历
if(vis[dx][dy] == 1) {
continue;
}
vis[dx][dy] = 1;
vis[6-dx][6-dy] = 1;
dfs(dx,dy);
//回溯
vis[dx][dy] = 0;
vis[6-dx][6-dy] = 0;
}
}
public static void main(String[] args) {
//vis数组初始化
vis = new int[7][7];
//从中心点开始遍历,记住(3,3)点要赋值为1
vis[3][3] = 1;
dfs(3,3);
//中心对称除以4
System.out.println(ans/4);
}
}
最终得到的答案为:509
好了,这道题的题解就到这里了,有疑惑的同学可以在下方评论区留言哦!