题目描述:
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。
试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。
输出格式:
输出一个整数表示答案
本题采用dfs算法,我们会发现,不管怎样切割,表格的中心点(3,3)必定是切割点,所以我们选择使用从中心点(3,3)处开始深搜切割点的方法而不是深搜格子的方法,当搜索到的切割点在边沿处则是搜索完毕(到达边沿处即已经将表格切割为两块)。
另外要注意的是,旋转对称一共有四种方向,因此最后得到的结果要除以4。
#include <iostream>
using namespace std;
int v[7][7];//访问数组
int ans = 0;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
void dfs(int x,int y)
{
if(x == 0 || x == 6 || y == 0 || y== 6)//切割点在边缘处
{
ans++;
return ;
}
for(int i = 0;i < 4;i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if(!v[tx][ty])
{
v[tx][ty] = 1;
v[6-tx][6-ty] = 1;
dfs(tx,ty);
v[tx][ty] = 0;//回溯
v[6-tx][6-ty] = 0;//回溯
}
}
}
int main()
{
v[3][3] = 1;
dfs(3,3);
cout << ans/4;
return 0;
}