问题描述
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请输出该整数,不要填写任何多余的内容或说明文字。
输入
无输入
输出
一个整数
提示
用printf或cout输出答案
思路:
看到这道题,第一反应是从6X6的方格里使用DFS选18个格子,并在选的过程中保证中心对称,但是细想一下,因为DFS要选择起点,但是起点有6X6个点,而且对于一种方案,某些起点会包含在里面,求出的结果显然不能单纯的除以一个常数来得到最终的答案。所以得另寻思路。
题干中说沿着边线剪开,所以除了直接找格子外,还可以找边线,把边线的交点看作dfs的单位。要使剪出来的两部分中心对称,只需要使剪的边线呈中心对称,所以需要从(3,3)开始剪,只需要剪到边界即可,然后再从中心点按中心对称的原则剪出另一条线,最后就得到两个呈中心对称的部分。
注意:搜索到边界的路线时,可能朝四个方向剪,所以相同的剪法会重复计算四次。因此最后求出的方法数/4就是最终答案
代码:
#include<bits/stdc++.h>
using namespace std;
int mp[10][10];
int vis[10][10];
int dx[]= {-1,1,0,0};
int dy[]= {0,0,1,-1};
int ans;
int n=6;
void dfs(int x,int y)
{
if(x==0||x==n||y==0||y==n)
{
ans++;
return ;
}
for(int i = 0; i<4; i++)
{
int tx = x+dx[i];
int ty = y+dy[i];
if(!vis[tx][ty])
{
vis[tx][ty]=1;
vis[n-tx][n-ty]=1;
dfs(tx,ty);
vis[tx][ty]=0;
vis[n-tx][n-ty]=0;
}
}
}
int main()
{
vis[n/2][n/2]=1;
dfs(n/2,n/2);
cout<<ans/4<<endl;
}