题目描述
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。
输出一个整数表示答案
题解
一看就是用dfs做,这个题用方格的角度去想很难想出全部的答案。要换个角度,看方格线,假设左上角的坐标是(0,0),那么右下角就是(6,6),进行dfs,走的时候中心对称点也要进行访问,一旦走到边界上,即(x == 0 || y == 0 || x == 6 || y == 6),就走出一条分割线,这就是一种分割方法。
#include <iostream>
#include <algorithm>
using namespace std;
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0},vis[7][7],ans=0;
void dfs(int x,int y)
{
if(x==0||y==0||x==6||y==6)
{
ans++;
return ;
}
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(vis[nx][ny]||nx<0||nx>7||ny<0||ny>7)
continue;
vis[nx][ny]=1;
vis[6-nx][6-ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;
vis[6-nx][6-ny]=0;
}
}
int main()
{
vis[3][3]=1;
dfs(3,3);
cout << ans/4 << endl;
}