1
、题目描述
6x6
的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可
行的分割法。
试计算:包括这
3
种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种
分割法。
2
、题解
又是暴搜。第
1
题
DFS
,第
2
题
BFS
,第
3
题
BFS
,这题又回到
DFS
。下一题估计是
BFS
?
倪文迪的话:
“
这道题可能上来会想到搜格子,但搜格子意味着更高的复杂度以及判连通的
需要,本题似乎搜索要切开的边更优。由题意,这一条切割线必定经过图的中心点,那么我们
一旦确定了半条到达边界的分割线,就能根据这半条对称画出另外半条。而由于结果中心对称
性,搜索出来的个数应该除以
4
得出最终结论。在搜索过程中需要注意的是,我们搜索出的半
条分割线不能同时经过关于中心对称的两个点,所以在标记时,需要将对称的点也标上。
”
中心点是
(3,3)
,从(3,3)出发,向右、向左、向上、向下,四个方向
DFS
即可
public class qiege {
public static int bian = 7;
public static int min = 0;
public static int max = bian - 1;
public static int ans = 0;
public static int visited = 1;
public static int novis = 0;
public static int zhong = (int)((bian - 1) / 2);
public static int[][] map = new int[bian][bian];
public static void main(String[] args) {
fenge(zhong, zhong);
System.out.println(ans / 4);
}
public static void fenge(int i, int j) {
if (map[i][j] == visited) {
return;
}
if (map[max - i][max - j] == visited) {
return;
}
if(i == min || i == max) {
ans++;
return ;
}
if (j == min || j == max) {
ans++;
return;
}
map[i][j] = visited;
map[max - i][max - j] = visited;
fenge(i + 1, j);
fenge(i - 1, j);
fenge(i, j + 1);
fenge(i, j -1);
map[i][j] = novis;
map[max - i][max - j] = novis;
}
}