题目
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。
试计算:一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
解题思路
将方格的左下顶点设为(0,0),(3,3)设为递归的开始点,沿着四个方向不断递归,直到横坐标为0/6或者纵坐标为0/6。
注意点:
- 如果没有将对称点也一起赋值,标注已走过,结果会增大。
代码
#include<iostream>
using namespace std;
int dire[][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int vis[7][7];
int ans = 0;
void dfs(int x,int y){
if(x==6||x==0||y==6||y==0){
ans++;
return;
}
vis[x][y] = 1;
vis[6-x][6-y] = 1;
for(int i=0;i<4;i++){
int nx = x + dire[i][0];
int ny = y + dire[i][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;
}