题目
方格分割
6 X 6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
试计算: 包括这 3 种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
思路
经典的dfs,从中心对称开始分割
代码
#include<iostream>
using namespace std;
int v[7][7] = { 0 };
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int cut = 0;
void dfs(int x,int y)
{
if(x == 0||x == 6||y == 0||y == 6){//沿着格子的边线剪开成两部分
cut++;
return;
}
for(int i = 0;i < 4;i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if(v[tx][ty] == 0){
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<<cut/4;
return 0;
}
- 总结:关键是从中心对称开始分割的