6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字。
答案:509
解题思路:
根据三幅图可以发现剪出来的两个图形关于方格纸中心完全对称,而且剪出来的方格都是连续的,所以最简单的减法就是,在方格纸中关于中心对称画一条线直至边界线,按着线剪出来的方格就是连续且完全对称的。
那么就要建一个7*7的二维数组,中心(3,3),对剪过的的点以及中心对称的点标记。
代码如下:
package test;
public class CutSquare {
static long count = 0L;//计数有多少种剪发法
//一个6*6的方格纸对应为一个7*7的二维数组
static boolean[][] vis = new boolean[7][7];//标记数组
//进行深度优先搜索
public static void dfs(int x, int y) {
vis[x][y] = true;//出发点被标记访问过
if (x == 0 || x == 6 || y == 0 || y == 6) {//剪到边界,计数加一,返回上一步
count++;
return;
}
for (int i = 0; i < 4; i++) {
int dx = x;
int dy = y;
switch (i) {//一共有四种方向的剪法
case 0:
dy += 1;//向上剪
break;
case 1:
dy += -1;//向下剪
break;
case 2:
dx += 1;//向右剪
break;
case 3:
dx += -1;//向左剪
break;
default:
break;
}
if (!vis[dx][dy]) {
vis[dx][dy] = true;//剪到的坐标被标记
vis[6 - dx][6 - dy] = true;//中心对此点也被标记
dfs(dx, dy);//进入下一剪刀
//对边界点还原初始化
vis[6 - dx][6 - dy] = false;
vis[dx][dy] = false;
} else
continue;
}
}
public static void main(String[] args) {
dfs(3, 3);//(3,3)是中心点
System.out.println(count / 4);//考虑到4种旋转后的图形都是一样的
}
}