标题:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字。
code
#include <iostream>
using namespace std;
//建立一个平面直角坐标系,左下角为原点
//因为求一共有多少可能,所以选用DFS搜索
//因为要求分割成中心对称的两个图形,
//所以可以从中心点(3,3)开始对称搜索
//搜索过程需要从中心点开始向上向下向左向右搜索
//所以定义四个方向距离原点一个单位距离的点
//并且储存在数组里
int dire[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
//建立一个平面直角坐标系,左下角为原点,
//定义二维数组代表每一个点的横坐标纵坐标
int visited[7][7];
int ans;
void dfs(int x,int y)
{
//结束搜索的标志
//搜索的点到格子四个外轮廓
if(x == 0 || y == 0 || x == 6 || y == 6)
{
ans++;
return ;
}
//将搜索过的点标记为1
visited[x][y] = 1;
visited[6-x][6-y] = 1;
for(int k=0;k<4;k++)
{
int nx = x + dire[k][0];
int ny = y + dire[k][1];
if(nx < 0 || nx > 6 || ny < 0 || ny > 6)
{
continue;
}//从一点向四个方向搜索,超出搜范围跳出循环
if(!visited[nx][ny])
{
dfs(nx,ny);
}//如果这个点是没搜索过的点就从这个点开始继续搜索
}
//搜索出一种情况后,清除标记
visited[x][y] = 0;
visited[6-x][6-y] = 0;
}
int main()
{
dfs(3,3);
//因为一种答案旋转90度,180度,270度后的图形都能被搜索到,但是题目中要求不重复所以最后答案除以4
cout << ans / 4 << endl;
return 0;
}
答案
509