四、题目:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法.
- 分析思路:
仔细观察这个图会发现,它是关于中心点各个方向对称的
用DFS来就解决
解题的时候以左下方点为原点,用二维数组的方法
代码:
#include<iostream>
using namespace std;
int ans;
int dire[][2]={{-1,0},{1,0},{0,-1},{0,1}}; //代表4个方向,上下左右
int vis[7][7]; //哪些点已被访问过
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 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(!vis[nx][ny]){ //若新的点未被访问过
dfs(nx,ny); //深搜
}
}
vis[x][y]=0;
vis[6-x][6-y]=0; //对称
}
int main(){
dfs(3,3); //初始点
cout<<ans/4<<endl;
return 0;
}
答案:509