思路:
这道题可能上来会想到搜格子,但搜格子意味着更高的复杂度以及判连通的需要,本题似乎搜索要切开的边更优。由题意,这一条切割线必定经过图的中心点,那么我们一旦确定了半条到达边界的分割线,就能根据这半条对称画出另外半条。而由于结果中心对称性,搜索出来的个数应该除以4得出最终结论。在搜索过程中需要注意的是,我们搜索出的半条分割线不能同时经过关于中心对称的两个点,所以在标记时,需要将对称的点也标上。”
中心点是(3,3),从(3,3)出发,向右、向左、向上、向下,四个方向DFS即可
————————————————
从中心点开始dfs,每到一个点,将其与中心点对称的点也标记,这样就能保证分割的两个图形对称。
package pastExamPaper;
/*
方格分割
思路:从中心点开始dfs,每到一个点,将其与中心点对称的点也标记,这样就能保证分割的两个图形对称。
*/
public class Demo79 {
private static int ans;
private static int[][] dire = {
{-1,0},
{1,0},
{0,-1},
{0,1}
};
private static int[][] vis = new int[7][7];
public static void main(String[] args) {
dfs(3,3);
System.out.println(ans/4);//509
}
private static void dfs(int x, int y){
if ( x == 0 || y == 0 || x == 6 || y == 6 ){
ans++;
return;
}
vis[x][y] = 1;
vis[6-x][6-y] = 1;
for ( int k = 0; k < 4; k++ ){
int nx = x + dire[k][0];
int ny = y + dire[k][1];
if ( nx < 0 || nx > 6 || ny < 0 || ny > 6 ){
continue;
}
if (vis[nx][ny] == 0){
dfs(nx,ny);
}
}
//回溯
vis[x][y] = 0;
vis[6-x][6-y] = 0;
}
}