这是蓝桥2017 第八届 省赛 C/C++B组 第四题
思路来源 点击打开链接
在此写下自己的一些理解
标题:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字。
思路:
如果把样例图案剪开,发现有且只有两个点在边界上,且一定经过 (3,3)点
那么以(3,3)为起点进行深搜,深搜到一个点那么他的中心对称点相当于也搜过了,
如果发现搜到了边界,那么它的中心对称点也到了边界 沿着已经搜过的点剪开,那么
剪开的两个图形为中心对称图形,但要注意最终的结果要除以4
例如 我们从(3,3)点出发一直向右到边界 , 或一直向左,或一直向上,或一直向下
剪出来的图形是同一个
代码如下
#include<iostream>
using namespace std;
int u[7][7];//标记点有没有被搜索过 由于是全局变量 初始值为零
long long sum =0 ;
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int x,int y);
int main()
{
u[3][3] = 1;
dfs(3,3);
printf("%lld %lld",sum,sum/4);
return 0;
}
void dfs(int x,int y)
{
int nx,ny,i,j,k;
if(x==0 || y==0 || x== 6 || y== 6)
{
sum ++;
return;
}
for(i=0;i<4;i++){//四个方向
nx = x + dir[i][0];//新的坐标
ny = y + dir[i][1];
if(u[nx][ny]==0){
u[nx][ny] = 1;//标记
u[6-nx][6-ny] = 1;
dfs(nx,ny);
u[nx][ny] = 0;
u[6-nx][6-ny] = 0;
}
}
}