题目描述:
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字。
分析:这道题关键在于理解,首先必须明确一点,无论怎么分,分割线一定过中心点,因此,从分割线角度来入手,会简单许多
而且要注意到,第一次从中点出发的四个方向是对称的,因此结果要/4
DFS,从中心节点开始,每次从上下左右选一个方向,直到到达边界为止,计数一次
还有一点要注意,当分割线从中心点向右移动时,因为对称分割,所以其实也有一条线往左延伸,所以记录到达点book[i][j]=1时,要把对称点book[m-i][n-j]也=1
代码如下:
#include<iostream>
using namespace std;
int map[8][8];
int book[8][8];
int direction[4][2]={-1,0,1,0,0,-1,0,1};//上下左右
int sum=0;
void DFS(int x,int y);
int main()
{
for(int i=1;i<=7;i++)
for(int j=1;j<=7;j++)
{
map[i][j]=0;
book[i][j]=0;
}
book[4][4]=1;
DFS(4,4);
cout<<sum/4;
return 0;
}
void DFS(int x,int y)
{
if(x==1||x==7||y==1||y==7)
{
sum++;
return;
}
for(int i=0;i<4;i++)
{
int nextx=x+direction[i][0];
int nexty=y+direction[i][1];
if(nextx<1||nexty<1||nextx>7||nexty>7)
continue;
if(book[nextx][nexty]==0)
{
book[nextx][nexty]=1;
book[8-nextx][8-nexty]=1;
DFS(nextx,nexty);
book[nextx][nexty]=0;
book[8-nextx][8-nexty]=0;
}
}
return;
}
答案:
509