题目
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
如下就是三种可行的分割法。
试计算: 包括这 3种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。
解题:
1.本题问共有多少种方法了,采用深度优先方法,如若递归到边界,则返回1进行累加;
2.两个图形是一个中心对称图形,因为是分割则对各个方格的的顶点进行分析,中点坐标为(3.3),且裁剪的位置是对称的
3.旋转对称的属于同一种分割法,递归回来的总数需/4
代码:
#include<iostream>
using namespace std;
const int N = 10;
int dx[] = { 1,0,-1,0 },dy[]={0,1,0,-1};
int n = 7;
bool st[N][N];
int dfs(int x, int y)
{
if (x == 0 || x == 6 || y == 0 || y == 6)
return 1;
int res = 0;
for (int i = 0; i < 4; i++)
{
int tx = x + dx[i], ty = y + dy[i];
if (tx < 0 || ty < 0 || tx >= n || ty >= n || st[tx][ty])
continue;
st[tx][ty] = true;
st[6 - tx][6 - ty] = true;
res += dfs(tx, ty);
st[tx][ty] = false;
st[6 - tx][6 - ty] = false;
}
return res;
}
int main()
{
st[3][3] = true;
cout << dfs(3, 3)/4 << endl;
return 0;
}