6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法.
使用DFS搜索,用一个二维的visit数组标记是否走过,回溯清空标记,遍历dire状态数组去深搜。
#include<bits/stdc++.h>
using namespace std;
int dire[][2]={{-1,0},{0,1},{1,0},{0,-1}};
int visit[7][7];
int ans;
void dfs(int x,int y)
{
if(x==0||x==6||y==0||y==6)
{
ans++;
return;
}
visit[x][y]=1;
visit[6-x][6-y]=1;//全部标记
for(int i = 0;i<4;i++)
{
int x_new = x+dire[i][0];
int y_new = y+dire[i][1];
if(visit[x_new][y_new]==0)
{
dfs(x_new,y_new);
visit[x_new][y_new] = 0;
visit[6-x_new][6-y_new] = 0;
}
}
}
int main()
{
dfs(3,3);
cout<<ans/4;
return 0;
}