2017蓝桥杯 省赛D题(方格分割)

时间:2023-03-09 09:16:11
2017蓝桥杯 省赛D题(方格分割)

6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。

如图:p1.png, p2.png, p3.png 就是可行的分割法。

2017蓝桥杯 省赛D题(方格分割) 2017蓝桥杯 省赛D题(方格分割) 2017蓝桥杯 省赛D题(方格分割)

试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。

请提交该整数,不要填写任何多余的内容或说明文字。

思路:从中间点搜索碰到边界答案就加1 然后值得注意的是每一次都要标记两个点 因为是对称搜索的 其次最后答案需要除4,因为题目中说要旋转对称的是同一种。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long int
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[]={,,,,,,,,,,,,};
int dir[][]={, ,, ,-, ,,-};
int dirs[][]={, ,, ,-, ,,-, -,- ,-, ,,- ,,};
const int inf=0x3f3f3f3f;
const ll mod=1e9+;
int ans;
bool vis[][];
void dfs(int x,int y){
if(x==||x==||y==||y==){
ans++;
return ;
}
for(int i=;i<;i++){
int xx=x+dir[i][];
int yy=y+dir[i][];
if(xx>=&&xx<=&&yy>=&&yy<=&&!vis[xx][yy]){
vis[xx][yy]=;
vis[-xx][-yy]=;
dfs(xx,yy);
vis[xx][yy]=;
vis[-xx][-yy]=;
}
}
}
int main(){
ios::sync_with_stdio(false);
ans=;
vis[][]=;
dfs(,);
cout<<ans/<<endl;
return ;
}