题目:
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
如下就是三种可行的分割法。
![]()
![]()
核心思想:
画分割线的思想,从方格中心点开始(因为分割线要中心对称,才能使沿分割线剪出来的格子也是中心对称的),向四个方向延伸分割线,延伸到达下一个点后,继续向四个方向延伸分割线线,以此类推,其中向一个方向延伸时,中心对称的另一条线也要延伸,才能达到分割线剪出来的格子中心对称的效果
代码:
package lanqiaobei;
public class fanggefenge {
static int ans=0;
public static void dfs(int x,int y,int[][] visit,int[][] direction) {//深度优先遍历
if(x==0||y==0||x==6||y==6) {//走到头了说明分割线画完了,一种情况完成ans+1
ans++;
return;//到头了,回头,走下一个遍历
}
visit[x][y]=1;//这个坐标走过了
visit[6-x][6-y]=1;//使对称
for(int i=0;i<4;i++) {
//调整坐标
int mx=x+direction[i][0];
int my=y+direction[i][1];
if(mx<0||mx>6||my<0||my>6) continue;//不符合的情况除掉,不对它进行递归
if(visit[mx][my]==0)//这个坐标没走过,则进行深度遍历
dfs(mx, my, visit, direction);
}
//回溯,本次的各个方向的遍历完成后,不能对其他遍历产生影响
visit[x][y]=0;
visit[6-x][6-y]=0;
}
public static void main(String[] args) {
int[][] direction = {{1,0},{-1,0},{0,1},{0,-1}};//用于依次为向右向左向上向下
int[][] visit = new int[7][7];//标志数组,标志这个坐标是否走过
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
visit[i][j]=0;//一开始都没走过,赋值0
dfs(3, 3, visit, direction);//从中心点开始走
System.out.println("可能的分割法有:"+ans/4+"种");//别忘了除四,中心对称是不算的
}
}