6x6的方格,沿着格子的边线剪开成两部分。

要求这两部分的形状完全相同。

如图:p1.png, p2.png, p3.png 就是可行的分割法。

试计算:

包括这3种分法在内,一共有多少种不同的分割方法。

注意:旋转对称的属于同一种分割法。

请提交该整数,不要填写任何多余的内容或说明文字。


第八届蓝桥杯C++B组:方格分割_边界条件第八届蓝桥杯C++B组:方格分割_边界条件_02第八届蓝桥杯C++B组:方格分割_#include_03

答案:509

思路:

1,如果以每个格子进行分割的话,使用bfs(先纵后横(走到底)——无法切成成T字型的形状);

2,然后考虑以格子上的每个点,进行分割,这样就可以使用bfs算法;

3.以正方形的中心点(3,3)【 坐标[0,6] 】,使用bfs,标注现在切割的方向和它关于中心点对称的方向为已访问,然后向四周切割,越界时,进行下次切割;如果遇到没有被访问,则bfs;边界条件(当x或y,遇到0,6时,方案数+1,并返回)

参考代码:

#include<cstdio>

int dire[][2]= {{-1,0}, {1,0}, {0,1}, {0,-1}};//四个方向
int vis[7][7];//是否被访问
int ans;//结果


void dfs(int x, int y){
if(x == 0 || y == 0 || x == 6 || y == 6){//踏在里边线上面
ans++;
return;
}
//把当前与对称点标记位已访问
vis[x][y] = 1;
vis[6 - x][6 - y] = 1;//对称

for (int i = 0; i < 4; ++i) {
int dx = x + dire[i][0];
int dy = y + dire[i][1];

if(dx < 0 || dx > 6 || dy < 0 || dy > 6) continue;//越界

if(!vis[dx][dy]){//没有被访问过
dfs(dx, dy);
}
}

//回溯
vis[x][y] = 0;
vis[6 -x][6 - y] = 0;
}

int main(){
dfs(3,3);//正方形中心点的位置
printf("%d", ans/4);//旋转4次都是相同的,四个方向都是对称的
}