[蓝桥杯2017初赛]方格分割
- Description
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。
如图就是可行的分割法。
- Input
无
- Output
输出一个整数表示答案
分析
因为要分割成中心对称图形,所以图中所有的点的坐标,都关于中心点对称。直接从中心点dfs搜索,每次把原点和对称点标记即可。
- AC代码
#include<bits/stdc++.h>
using namespace std;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//移动方向,上下左右
int vis[7][7]={0};
int ans=0;//计数
bool ok(int x,int y) //判断点是否在范围内
{
if(x>=0&&x<=6&&y>=0&&y<=6)
return 1;
return 0;
}
void dfs(int x,int y)
{
if(x==6||x==0||y==6||y==0) //设置出口
{
ans++;
return;
}
else
{
for(int i=0;i<4;i++) //4个方向,依次遍历
{
int nx=x+dx[i];
int ny=y+dy[i];
if(!vis[nx][ny]&&ok(nx,ny))
{
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; //旋转4个方向算相同情况,结果除以4
return 0;
}